Ответы:
Вы должны использовать printfвместоecho :
printf "%s\n" "${mtches[@]}"
Если mtchesпусто, то все равно выведите одну пустую строку. Чтобы учесть это:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
В bash(а также POSIX оболочек), часто используются позиционные параметры массива , как "$@"вместо того , чтобы "$*", если у вас нет особых причин. Это также верно для оболочек, поддерживающих обычные массивы, из man bash - section Arrays :
На любой элемент массива можно ссылаться, используя $ {name [subscript]}. Скобки необходимы, чтобы избежать конфликтов с операторами расширения имени оболочки. Если нижний индекс равен «@» или «*», слово распространяется на все члены имени массива. Эти индексы отличаются только тогда, когда слово появляется в двойных кавычках. Если слово заключено в двойные кавычки, $ {name [*]} раскрывается в одно слово, в котором значение каждого члена массива отделяется первым символом переменной IFS, а $ {name [@]} раскрывает каждый элемент имени в отдельном слове. Когда нет элементов массива, $ {name [@]} расширяется до нуля. Если раскрытие в двойных кавычках происходит внутри слова, расширение первого параметра объединяется с начальной частью исходного слова, а расширение последнего параметра объединяется с последней частью исходного слова.
Используйте только "${array[*]}"тогда, когда вы хотите объединить все элементы массива в строку.
Вы хотите использовать ${mtches[*]}вместо этого.
Когда вы используете "${mtches[@]}", значение не имеет значения $IFS, bash разделит массив на несколько аргументов. То, что вы хотите, это один аргумент, к которому присоединяется каждый элемент массива \n. ${mtches[*]}выполняет это.
Также в качестве временного способа настройки $IFSвы можете сделать:
( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )
Тогда вам не нужно беспокоиться об установке обратно.
printf...
Использование для :
for each in "${alpha[@]}"
do
echo "$each"
done
Использование истории ; обратите внимание, что это не удастся, если ваши значения содержат !:
history -p "${alpha[@]}"
Использование базового имени ; обратите внимание, что это не удастся, если ваши значения содержат /:
basename -a "${alpha[@]}"
Использование shuf ; обратите внимание, что результаты могут быть не в порядке:
shuf -e "${alpha[@]}"
for ENTRY in ${ARRAY[@]}; do
echo $ENTRY
done > outfile
Красиво и читабельно и не значит возиться с IFS. Это также означает, что вы можете настроить обработку каждой строки.
echoкоторый не может быть использован для произвольного контента и забыл процитировать ваши переменные . Немного лучшая версия уже была опубликована StevenPenny