Saya memiliki masalah di salah satu skrip shell saya. Tanya beberapa rekan, tetapi mereka semua hanya menggelengkan kepala (setelah beberapa goresan), jadi saya datang ke sini untuk jawaban.
Menurut pemahaman saya, skrip shell berikut harus mencetak "Count is 5" sebagai baris terakhir. Kecuali tidak. Mencetak "Hitung 0". Jika "while read" diganti dengan jenis loop lain, itu berfungsi dengan baik. Ini skripnya:
gema "1"> input.data gema "2" >> input.data gema "3" >> input.data gema "4" >> input.data gema "5" >> input.data CNT = 0 cat input.data | saat membaca; melakukan biarkan CNT ++; echo "Menghitung $ CNT" selesai gema "Hitung adalah $ CNT"
Mengapa ini terjadi dan bagaimana saya bisa mencegahnya? Saya sudah mencoba ini di Debian Lenny dan Squeeze, hasil yang sama (yaitu bash 3.2.39 dan bash 4.1.5. Saya sepenuhnya mengaku tidak menjadi penyihir skrip shell, jadi petunjuk apa pun akan dihargai.
Ini semacam kesalahan 'umum'. Pipa membuat SubShell, sehingga
while read
berjalan pada shell yang berbeda dari skrip Anda, yang membuatCNT
variabel Anda tidak pernah berubah (hanya yang ada di dalam subkulit pipa).Kelompokkan yang terakhir
echo
dengan subkulitwhile
untuk memperbaikinya (ada banyak cara lain untuk memperbaikinya, ini salah satunya. Iain dan jawaban Ignacio punya yang lain.)Penjelasan panjang:
CNT
skrip Anda sebagai nilai 0;|
kewhile read
;$CNT
Variabel Anda diekspor ke SubShell dengan nilai 0;CNT
nilainya menjadi 5;echo
awal AndaCNT
0.sumber
Ini bekerja
sumber
let CNT++
yang seharusnyaCNT="$((CNT+1))"
menggunakan ekspansi aritmatika yang sesuai dengan POSIX . Sisanya sudah portabel.Sebaliknya, coba masukkan data dalam sub-shell, seperti file sebelum loop sementara. Ini mirip dengan solusi lain, tetapi menganggap Anda tidak ingin beberapa file terputus-putus:
sumber