skrip bash sambil mengulang jika variabel benar

2

Saya memiliki skrip bash berikut:

while [ $loop == "true" ]
   do
     //do stuff
   done

tetapi mengatakan kesalahan di [.

Ini juga berjalan sebagai daemon, ketika argumen berhenti dilewatkan ke skrip ... loop harus Saya menduga pengaturan $ loop ke false akan secara otomatis mengakhiri loop.

firebird
sumber
"... katanya error at [." Sangat?
Ignacio Vazquez-Abrams
Miliki -1 untuk tidak memberi atau menguraikan pesan kesalahan dengan benar.
JdeBP

Jawaban:

1

Cara terbaik untuk mengetik ini adalah:

while [ "$loop" = "true" ]

Baca bagian "Mengerjakan perintah uji" di URL berikut:
http://wiki.bash-hackers.org/syntax/quoting

Mattias Ahnberg
sumber
2
Semua nilai dalam bash adalah string. Kutipan tidak ada hubungannya dengan itu.
Ignacio Vazquez-Abrams
2
Kutipan membuatnya bekerja. Dan = membandingkan string, dibandingkan dengan (misalnya) -eq yang membandingkan bilangan bulat. Periksa Advanced Bash Scripting Guide untuk informasi lebih lanjut "Perhatikan bahwa perbandingan integer dan string menggunakan serangkaian operator yang berbeda." tldp.org/LDP/abs/html/comparison-ops.html
Mattias Ahnberg
Atau, Anda benar, "" itu sendiri tidak membuatnya menjadi string, Anda mungkin juga menggunakan: $ loop = true tetapi bash masih membuat perbedaan antara string dan integer. Diperbarui sedikit jawabannya.
Mattias Ahnberg
6
Anda tahu, mengatakan kepada seseorang bahwa mereka salah tanpa menjelaskan dan mengoreksi dengan benar adalah tidak ada gunanya dan bodoh?
Mattias Ahnberg
1
Atau seperti yang dikatakan GreyCat: Gunakan Lebih Banyak Kutipan!
l0b0
5

M. Vazquez-Abrams benar. Ini tidak ada hubungannya dengan tanda kutip membuat hal-hal yang ada sudah string menjadi string, atau ide yang salah itu = di bash built-in [ Perintah adalah apa pun selain perbandingan string. (Baca § 6.4 dari Bash User Manual, orang-orang!) Ini semua harus dilakukan dengan apa yang terjadi pada bidang kosong setelah pemisahan bidang mengubah kata menjadi bidang.

Jika variabel shell loop kosong atau nol $loop meluas ke bidang kosong. Setelah pemisahan bidang, bidang kosong dibuang. Perhatikan bahwa pemisahan bidang dan periksa bidang kosong mendahului penghapusan kutipan. Begitu "$loop" mengembang ke bidang "", yang mana tidak kosong dan karenanya tidak dihapus. Setelah penghapusan kutipan maka itu adalah bidang kosong, yang menjadi argumen kosong ke perintah.

Itu [ perintah membutuhkannya = operator untuk memiliki dua operan, kedepan dan belakang. Yang lainnya adalah kesalahan sintaksis. Karena bidang kosong dihapus, urutan kata-kata

[ $loop = true ]
meluas ke empat bidang
  1. [
  2. =
  3. true
  4. ]

ketika [ kebutuhan perintah lima menjadi benar secara sintaksis:

  1. [
  2. =
  3. true
  4. ]

Tentu saja, string kosong tidak sama dengan string empat karakter true, dan status keluar dari perintah adalah nol.

Sekali lagi, semua ini ada dalam Bash User Manual, dalam §3.5 dan §3.5.7. Manualnya adalah temanmu.

JdeBP
sumber
Oh ya, tentu saja kamu benar. Bagus! Saya jauh lebih menghargai jenis koreksi dan penjelasan ini daripada komentar sombong dari Tuan Vazquez-Abrams yang hanya menunjukkan bahwa seseorang salah tanpa repot menjelaskan atau mengklarifikasi. Sangat tidak membantu. Saya mengatakan diri saya buruk dengan mengkonversi ke string, tetapi saya maksudkan ada perbedaan antara string dan integer dalam bagaimana Anda seharusnya mengulanginya. Dan saya selalu punya kebiasaan menempatkan tes / string saya di dalam "" untuk menangani ruang dengan benar. :) Saya juga salah berasumsi bahwa $ loop disetel ke "true", sementara itu mungkin belum.
Mattias Ahnberg