


for i in apple orange kiwi do echo $i done
Так:
FRUITS = "apple orange kiwi"
for FRUIT in $FRUITS; do
echo $FRUIT
done
Обратите внимание, что это не сработает, если в названиях ваших фруктов есть пробелы. В этом случае вместо этого см. этот ответ, который немного менее переносим, но гораздо более надежен.
В Bash в Mac OS X мне, кажется, нужна точка с запятой или разрыв строки перед «делать».
Да, вам нужна точка с запятой, если только ваше «делать» не находится в новой строке. Кроме того, $ IFS должен содержать пробел, чтобы это работало.
в зависимости от IFS во время итерации (а не просто присваивания) - это плохая идея, что делает этот ответ неоптимальным. Конечно, мой тоже - я тестировал zsh, с тех пор исправлено для bash.
Это глючит. Посмотрите, что произойдет, если у вас есть * в качестве имени фрукта - вместо буквального, оно раскрывается как глобус, поэтому в вашем текущем каталоге есть файлы, которые отображаются как фрукты.
Теперь, когда понравившийся мне ответ был принят как правильный, я перейду к другой теме: как использовать IFS для личной выгоды. :-П
fruits = "apple,orange,kiwifruit,dried mango"
(IFS=,
for fruit in $fruits; do
echo "$fruit"
done)
Я заключил код в скобки, чтобы изменение IFS было выделено в отдельный подпроцесс; таким образом, в конце заключенного в квадратные скобки раздела IFS возвращается к своему старому значению. :-)
Когда я пробую fruits=(apple orange "kiwi fruit"), bash во время цикла разбивает «киви» и «фрукт» на отдельные объекты. Пока вы за / вход, IFS сожжет вас. Но echo ${fruits[2]} поступает правильно, и это приятно.
См. stackoverflow.com/questions/78592/… для версии этого кода, который работает.
bash (в отличие от POSIX sh) поддерживает массивы:
fruits=(apple orange kiwi "dried mango")
for fruit in "${fruits[@]}"; do
echo "${fruit}"
done
Это имеет то преимущество, что элементы массива могут содержать пробелы или другие члены $ IFS; если они были правильно вставлены как отдельные элементы, они считываются одинаково.
Я также вижу, что «сушеные» и «манговые» печатаются здесь как отдельные плоды с использованием bash в Debian и Mac OS X. Так что, похоже, это не защищает меня от IFS. :-(
emk, это у меня плохо - тестировал на zsh, а не на bash; исправил это с тех пор.
echo "$i"внутри цикла - без кавычек это расширяет глобус и разделяет IFS на элементы, делаяfoo barтаким же, какfoo bar, и заставляет*.txtотображать все совпадающие файлы в текущем каталоге, а не генерировать буквальный*.txt.