Что является хорошим эквивалентом списков Perl в bash?

В perl можно просто сделать следующее, чтобы сохранить и перебрать список имен

my @fruit = (apple, orange, kiwi);
foreach (@fruit) {
        print $_;
}

Что было бы эквивалентом в bash?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
24
0
21 122
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

for i in apple orange kiwi
do
  echo $i
done

echo "$i" внутри цикла - без кавычек это расширяет глобус и разделяет IFS на элементы, делая foo bar таким же, как foo bar, и заставляет *.txt отображать все совпадающие файлы в текущем каталоге, а не генерировать буквальный *.txt.

Charles Duffy 04.07.2011 03:24

Так:

FRUITS = "apple orange kiwi"
for FRUIT in $FRUITS; do
  echo $FRUIT
done

Обратите внимание, что это не сработает, если в названиях ваших фруктов есть пробелы. В этом случае вместо этого см. этот ответ, который немного менее переносим, ​​но гораздо более надежен.

В Bash в Mac OS X мне, кажется, нужна точка с запятой или разрыв строки перед «делать».

emk 17.09.2008 04:22

Да, вам нужна точка с запятой, если только ваше «делать» не находится в новой строке. Кроме того, $ IFS должен содержать пробел, чтобы это работало.

Chris Jester-Young 17.09.2008 04:24

в зависимости от IFS во время итерации (а не просто присваивания) - это плохая идея, что делает этот ответ неоптимальным. Конечно, мой тоже - я тестировал zsh, с тех пор исправлено для bash.

Charles Duffy 17.09.2008 04:39

Это глючит. Посмотрите, что произойдет, если у вас есть * в качестве имени фрукта - вместо буквального, оно раскрывается как глобус, поэтому в вашем текущем каталоге есть файлы, которые отображаются как фрукты.

Charles Duffy 01.11.2012 18:00

Теперь, когда понравившийся мне ответ был принят как правильный, я перейду к другой теме: как использовать 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]} поступает правильно, и это приятно.

emk 17.09.2008 04:28

См. stackoverflow.com/questions/78592/… для версии этого кода, который работает.

emk 17.09.2008 04:46
Ответ принят как подходящий

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 17.09.2008 04:35

emk, это у меня плохо - тестировал на zsh, а не на bash; исправил это с тех пор.

Charles Duffy 17.09.2008 04:37

Другие вопросы по теме