Odpowiedzi:
Państwo powinno używać printfzamiastecho :
printf "%s\n" "${mtches[@]}"
Jeśli mtchesjest pusty, to nadal wyświetla jeden pusty wiersz. Aby to uwzględnić:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
W bash(a także powłoki POSIX), często można wykorzystywać parametry pozycyjne tablicę jako "$@"zamiast "$*", chyba że masz szczególny powód. Dotyczy to również powłok, które obsługują zwykłe tablice, od man bash - sekcja Tablice :
Do dowolnego elementu tablicy można odwoływać się za pomocą $ {name [subscript]}. Nawiasy klamrowe są wymagane, aby uniknąć konfliktów z operatorami rozszerzenia nazw plików powłoki. Jeśli indeks dolny to „@” lub „*”, to słowo rozszerza się na wszystkich członków nazwy tablicy. Te indeksy dolne różnią się tylko wtedy, gdy słowo pojawia się w cudzysłowie. Jeśli słowo jest cytowane podwójnie, $ {nazwa [*]} rozwija się do pojedynczego słowa z wartością każdego elementu tablicy oddzieloną pierwszym znakiem zmiennej IFS, a $ {nazwa [@]} rozwija każdy element nazwy na osobne słowo. Gdy nie ma członków tablicy, $ {name [@]} rozwija się do zera. Jeśli rozwinięcie podwójnego cudzysłowu występuje w jednym słowie, rozwinięcie pierwszego parametru jest połączone z początkową częścią oryginalnego słowa, a rozwinięcie ostatniego parametru jest połączone z ostatnią częścią oryginalnego słowa.
Używaj tylko "${array[*]}"wtedy, gdy chcesz połączyć wszystkie elementy tablicy w łańcuch.
Zamiast tego chcesz użyć ${mtches[*]}.
Kiedy używasz "${mtches[@]}", nie ma znaczenia, jaką jest wartość $IFS, bash podzieli tablicę na wiele argumentów. To, czego chcesz, to pojedynczy argument z każdym elementem tablicy dołączonym \n. ${mtches[*]}osiąga to.
Jako tymczasowy sposób ustawienia $IFSmożesz wykonać:
( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )
Więc nie musisz się przejmować przywracaniem ustawień.
printf...
Używanie do :
for each in "${alpha[@]}"
do
echo "$each"
done
Korzystanie z historii ; zauważ, że to się nie powiedzie, jeśli twoje wartości zawierają !:
history -p "${alpha[@]}"
Korzystanie z basename ; zauważ, że to się nie powiedzie, jeśli twoje wartości zawierają /:
basename -a "${alpha[@]}"
Korzystanie z shuf ; pamiętaj, że wyniki mogą nie zostać wyświetlone w kolejności:
shuf -e "${alpha[@]}"
for ENTRY in ${ARRAY[@]}; do
echo $ENTRY
done > outfile
Ładne i czytelne i nie oznacza bałaganu w IFS. Oznacza to również, że możesz dostosować obsługę każdej linii.
echoczego nie można użyć do dowolnych treści i zapomniałeś podać swoje zmienne . Nieco lepsza wersja została już opublikowana przez StevenPenny