Jawaban:
Anda harus menggunakan printf
alih-alihecho
:
printf "%s\n" "${mtches[@]}"
Jika mtches
kosong itu masih akan menampilkan satu baris kosong. Untuk memperhitungkan itu:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
Dalam bash
(dan juga kerang POSIX), Anda sering menggunakan array Parameter Posisi sebagai "$@"
pengganti "$*"
, kecuali Anda memiliki alasan khusus. Itu juga berlaku di shell yang mendukung array reguler, dari man bash - section Arrays :
Elemen array dapat dirujuk menggunakan $ {name [subscript]}. Kawat gigi diperlukan untuk menghindari konflik dengan operator ekspansi nama file shell. Jika subskripnya adalah '@' atau '*', kata tersebut diperluas ke semua anggota nama array. Subskrip ini berbeda hanya ketika kata itu muncul dalam tanda kutip ganda. Jika kata tersebut dikutip dua kali lipat, $ {name [*]} berkembang menjadi satu kata dengan nilai setiap anggota array dipisahkan oleh karakter pertama variabel IFS, dan $ {name [@]} memperluas setiap elemen nama ke kata yang terpisah. Ketika tidak ada anggota array, $ {name [@]} berkembang menjadi nol. Jika ekspansi kuotasi ganda terjadi dalam sebuah kata, ekspansi parameter pertama bergabung dengan bagian awal kata asli, dan perluasan parameter terakhir digabungkan dengan bagian terakhir dari kata asli.
Hanya gunakan "${array[*]}"
saat Anda ingin menggabungkan semua elemen array ke string.
Anda ingin menggunakan ${mtches[*]}
sebagai gantinya.
Saat Anda menggunakan "${mtches[@]}"
, tidak peduli berapa nilainya $IFS
, bash akan membagi array menjadi beberapa argumen. Yang Anda inginkan adalah argumen tunggal dengan setiap elemen array bergabung \n
. ${mtches[*]}
menyelesaikan ini.
Juga sebagai cara pengaturan sementara $IFS
, Anda dapat melakukan:
( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )
Maka Anda tidak perlu repot-repot mengaturnya kembali.
printf
...
Menggunakan untuk :
for each in "${alpha[@]}"
do
echo "$each"
done
Menggunakan sejarah ; perhatikan ini akan gagal jika nilai Anda mengandung !
:
history -p "${alpha[@]}"
Menggunakan nama bas ; perhatikan ini akan gagal jika nilai Anda mengandung /
:
basename -a "${alpha[@]}"
Menggunakan shuf ; perhatikan bahwa hasilnya mungkin tidak keluar secara berurutan:
shuf -e "${alpha[@]}"
for ENTRY in ${ARRAY[@]}; do
echo $ENTRY
done > outfile
Bagus dan mudah dibaca dan tidak berarti mengacaukan IFS. Ini juga berarti Anda dapat menyesuaikan penanganan setiap baris.
echo
yang tidak dapat digunakan untuk konten sewenang-wenang dan lupa mengutip variabel Anda . Versi yang sedikit lebih baik sudah diposting oleh StevenPenny