Что является хорошим эквивалентом списков Perl в bash?
Вопрос
В Perl можно было бы просто сделать следующее, чтобы сохранить и перебрать список имен:
my @fruit = (apple, orange, kiwi);
foreach (@fruit) {
print $_;
}
Какой эквивалент будет в bash?
Решение
bash (в отличие от POSIX sh) поддерживает массивы:
fruits=(apple orange kiwi "dried mango")
for fruit in "${fruits[@]}"; do
echo "${fruit}"
done
Преимущество этого подхода состоит в том, что элементы массива могут содержать пробелы или другие члены $IFS;если они были правильно вставлены как отдельные элементы, они считываются одинаково.
Другие советы
Так:
FRUITS="apple orange kiwi"
for FRUIT in $FRUITS; do
echo $FRUIT
done
Обратите внимание, что это не сработает, если в названиях ваших фруктов есть пробелы.В таком случае см. этот ответ вместо этого он немного менее портативен, но гораздо более надежен.
Теперь, когда ответ, который мне понравился, был принят как правильный, я перейду к другой теме:как использовать IFS
ради личной выгоды.:-П
fruits="apple,orange,kiwifruit,dried mango"
(IFS=,
for fruit in $fruits; do
echo "$fruit"
done)
Я поместил код в скобки, чтобы IFS
изменение изолировано в отдельный подпроцесс;таким образом, в конце раздела, заключенного в скобки, IFS
возвращается к своему старому значению.:-)
for i in apple orange kiwi do echo $i done