Вы должны использовать 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
вы можете сделать:Тогда вам не нужно беспокоиться об установке обратно.
источник
printf
...Использование для :
Использование истории ; обратите внимание, что это не удастся, если ваши значения содержат
!
:Использование базового имени ; обратите внимание, что это не удастся, если ваши значения содержат
/
:Использование shuf ; обратите внимание, что результаты могут быть не в порядке:
источник
Красиво и читабельно и не значит возиться с IFS. Это также означает, что вы можете настроить обработку каждой строки.
источник
echo
который не может быть использован для произвольного контента и забыл процитировать ваши переменные . Немного лучшая версия уже была опубликована StevenPenny