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"
Это выглядит просто и компактно