Untuk membaca file teks secara harfiah, jangan gunakan file biasa read
, yang memproses output dengan dua cara:
read
menafsirkan \
sebagai karakter pelarian; gunakan read -r
untuk mematikan ini.
read
terbagi menjadi kata-kata pada karakter dalam $IFS
; setel IFS
ke string kosong untuk mematikannya.
Idiom biasa untuk memproses file teks baris demi baris adalah
while IFS= read -r line; do …
Untuk penjelasan tentang idiom ini, lihat Mengapa while IFS= read
sering digunakan, bukan IFS=; while read..
? .
Untuk menulis string secara harfiah, jangan hanya menggunakan plain echo
, yang memproses string dengan dua cara:
- Pada beberapa shell,
echo
proses backslash lolos. (Pada bash, itu tergantung apakah xpg_echo
opsi diatur.)
- Beberapa string diperlakukan sebagai opsi, misalnya
-n
atau -e
(set yang tepat tergantung pada shell).
Cara portabel untuk mencetak string adalah dengan printf
. (Tidak ada cara yang lebih baik dalam bash, kecuali Anda tahu input Anda tidak terlihat seperti opsi untuk echo
.) Gunakan formulir pertama untuk mencetak string yang tepat, dan bentuk kedua jika Anda ingin menambahkan baris baru.
printf %s "$line"
printf '%s\n' "$line"
Ini hanya cocok untuk memproses teks , karena:
- Sebagian besar shell akan tersedak karakter null di input.
- Ketika Anda membaca baris terakhir, Anda tidak memiliki cara untuk mengetahui apakah ada baris baru di akhir atau tidak. (Beberapa shell yang lebih tua mungkin memiliki masalah lebih besar jika input tidak diakhiri dengan baris baru.)
Anda tidak dapat memproses data biner di shell, tetapi versi utilitas modern di sebagian besar unix dapat mengatasi data yang berubah-ubah. Untuk meneruskan semua input ke output, gunakan cat
. Bersinggungan, echo -n ''
adalah cara yang rumit dan tidak portabel dalam melakukan apa pun; echo -n
akan sama baiknya (atau tidak tergantung pada shell), dan :
lebih sederhana dan sepenuhnya portabel.
: >| "$file"
cat >>"$file"
atau, lebih sederhana,
cat >|"$file"
Dalam skrip, Anda biasanya tidak perlu menggunakan >|
karena noclobber
dinonaktifkan secara default.