Bash элементы массива печати на отдельных строках

Как напечатать элемент массива массива Bash на отдельных строках? Это работает, но, безусловно, есть лучший способ:

$ my_array=(one two three)
$ for i in ${my_array[@]}; do echo $i; done
one
two
three

Пробовал этот, но он не работал:

$ IFS=$'\n' echo ${my_array[*]}
one two three

Ответ 1

Попробуйте сделать это:

$ printf '%s\n' "${my_array[@]}"

Разница между [email protected] и $*:

  • Необязательно, результаты не заданы. В Bash оба расширяются до отдельных аргументов а затем wordplit и globbed.

  • Цитируется, "[email protected]" расширяет каждый элемент как отдельный аргумент, а "$*" расширяется до args, объединенных в один аргумент: "$1c$2c..." (где c первый char of IFS).

Вы почти всегда хотите "[email protected]". То же самое касается "${arr[@]}".

Всегда цитируйте их!

Ответ 2

Просто укажите аргумент для эха:

( IFS=$'\n'; echo "${my_array[*]}" )

вспомогательная оболочка помогает восстановить IFS после использования

Ответ 3

Использование для:

for each in "${alpha[@]}"
do
  echo "$each"
done

Использование истории; обратите внимание, что это не сработает, если ваши значения содержат !:

history -p "${alpha[@]}"

Использование basename; обратите внимание, что это не удастся, если ваши значения содержат /:

basename -a "${alpha[@]}"

Использование shuf; обратите внимание, что результаты могут не отображаться в порядке:

shuf -e "${alpha[@]}"

Ответ 4

Я попробовал ответы здесь в гигантском для... если цикл, но не получал никакой радости - так что я сделал это так, может быть, грязно, но сделал работу:

 # EXP_LIST2 is iterated    
 # imagine a for loop
     EXP_LIST="List item"    
     EXP_LIST2="$EXP_LIST2 \n $EXP_LIST"
 done 
 echo -e $EXP_LIST2

хотя это добавило пробел в список, что хорошо - я хотел немного отступом. Также предположим, что "\n" может быть напечатано в исходном $EP_LIST.

Ответ 5

Другим полезным вариантом является pipe to tr:

echo ${my_array[@]} | tr " " "\n"

Это выглядит просто и компактно