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

StackOverflow https://stackoverflow.com/questions/78592

  •  09-06-2019
  •  | 
  •  

Вопрос

В 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top