Відповіді:
Ви повинні використовувати printfзамістьecho :
printf "%s\n" "${mtches[@]}"
Якщо mtchesпорожній, він все одно виведе один порожній рядок. Для обліку цього:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
У bash(а також оболонках POSIX) ви часто використовуєте масив позиційних параметрів як "$@"замість них "$*", якщо у вас немає особливих причин. Це також стосується оболонок, які підтримують регулярні масиви, від man bash - розділ масиви :
На будь-який елемент масиву можна посилатися, використовуючи $ {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 -e "${alpha[@]}"
for ENTRY in ${ARRAY[@]}; do
echo $ENTRY
done > outfile
Приємно і читати і не означає возитися з IFS. Це також означає, що ви можете налаштувати обробку кожного рядка.
echoякий не можна використовувати для довільного вмісту, і забули процитувати ваші змінні . Трохи кращу версію вже опублікував СтівенПенні