2015-07-09 3 views
2

Я пытаюсь напечатать кучу строк в скрипте (в zsh), и он, похоже, не работает. Код будет работать, если я поместим массив в переменную и использую его вместо этого. Любые идеи, почему это не работает?Zsh массив строк в цикле

for string in (some random strings to print) ; echo $string

ответ

5

форма по умолчанию команды for в Zsh не использует скобки (если они есть, они не являются д в рамках for заявления):

for string in some random strings to print 
do 
    echo $string 
done 

Есть также несколько коротких форм, доступных для for:

  • для одиночных команд (чтобы быть точным: разовые трубопроводов или нескольких трубопроводов, связанных с && или ||, где трубопровод может быть только одна команда) есть два варианта:

    • форма по умолчанию, только без do или done:

      for string in some random strings to print ; echo string 
      
    • без in, но с круглыми скобками, а также без do или done

      for string (some random strings to print) ; echo $string 
      
  • для списка команд (как в стандартном формы), foreach вместо for, без in, с круглыми скобками и заканчивающийся end:

    foreach string (some random strings to print) echo $string ; end 
    

В вашем случае, вы смешали две короткие формы для отдельных команд. Из-за наличия inzsh не взял круглые скобки как синтаксический элемент команды for. Вместо этого они интерпретируются как квалификатор glob. Помимо того, что вы не намерены никаких имен файлов расширения, это не удается по двум причинам:

  • нет никакой закономерности (с или без фактических комков) до Глоб классификатором. Таким образом, любое совпадающее имя файла должно точно соответствовать пустой строке, что просто невозможно.

  • но в основном «некоторые случайные строки для печати» не является допустимым квалификатором glob. Вероятно, вы получите сообщение об ошибке «zsh: unknown file attribute: i» (по крайней мере, с zsh 5.0.5, это может зависеть от версии zsh).

3

Проверить zshforloop documentation:

for x (1 2 3); do echo $x; done 
for x in 1 2 3; do echo $x; done 
+0

Я знаю, что мы можем использовать переменную, чтобы сделать это; Я спрашиваю, есть ли способ избежать его использования? –

+1

Что не так с 'for x (1 2 3); do echo $ x; done' и 'for x in 1 2 3; do echo $ x; сделано?? –

+0

Вау! Это точно! Нет необходимости использовать 'in' при использовании массива? Можете ли вы, пожалуйста, обновить ответ, я отмечу как ответ. –

2

Вы, вероятно, пытается сделать это:

for string in some random strings to print ;do 
    echo $string 
done 
Смежные вопросы