Tanda kutip mencegah "pemisahan kata". Yaitu: memecah variabel menjadi beberapa item pada karakter spasi putih (atau lebih tepatnya, pada spasi, tab, dan baris baru seperti yang didefinisikan dalam nilai $IFSvariabel shell default ).
Sebagai contoh,
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
Di sini kita mendefinisikan howmanyfungsi yang hanya memberi tahu kita berapa banyak parameter posisi yang diberikan. Seperti yang Anda lihat, ada dua item yang diteruskan ke variabel, dan dengan tanda kutip teks dalam variabel diperlakukan sebagai satu unit.
Ini penting untuk memberikan informasi yang akurat. Misalnya, jika variabel berisi path ke file, dan nama file berisi spasi di mana saja di path, perintah yang Anda coba jalankan mungkin gagal atau memberikan hasil yang tidak akurat. Jika kami mencoba membuat file dengan $varvariabel,touch $var akan membuat dua file, tetapi touch "$var"hanya satu.
Sama halnya dengan Anda [ "$currentoutput" != "$lastoutput" ]. Tes khusus ini melakukan perbandingan pada dua string. Ketika tes berjalan, [perintah harus melihat 3 argumen - string teks, !=operator, dan string teks lainnya. Mempertahankan tanda kutip ganda mencegah pemisahan kata, dan [perintah melihat dengan tepat 3 argumen itu. Sekarang apa yang terjadi jika variabel tidak dikutip?
$ var="hello world"
$ foo="hi world"
$ [ $var != $foo ]
bash: [: too many arguments
$
Di sini, pemisahan kata terjadi, dan sebagai gantinya [melihat dua string hellodan worlddiikuti oleh!= , diikuti oleh dua string lainnya hi world. Poin utamanya adalah bahwa tanpa tanda kutip ganda, isi variabel dipahami sebagai unit yang terpisah dan bukan satu item keseluruhan.
Menetapkan substitusi perintah tidak memerlukan tanda kutip ganda seperti pada
var=$( df )
di mana Anda memiliki dfoutput perintah disimpan var. Namun, merupakan kebiasaan yang baik untuk selalu menggandakan variabel kutipan dan memerintahkan substitusi $(...)kecuali Anda memang menginginkan output diperlakukan sebagai item terpisah.
Di samping catatan,
while [ true ]
bagian bisa
while true
[adalah perintah yang mengevaluasi argumennya, dan [ whatever ]selalu benar terlepas dari apa yang ada di dalamnya. Sebaliknya, while truegunakan perintah trueyang selalu mengembalikan status keluar sukses (dan itulah yang whiledibutuhkan loop). Perbedaannya sedikit lebih jelas dan sedikit pengujian yang dilakukan. Atau, Anda juga bisa menggunakan :bukannyatrue
Kutipan ganda echo "" date and Timesebagian mungkin dapat dihapus. Mereka hanya memasukkan string kosong dan menambahkan ruang ekstra ke output. Jika itu diinginkan, jangan ragu untuk menyimpannya di sana, tetapi tidak ada nilai fungsional tertentu dalam kasus ini.
lsusb >> test.log
Bagian ini mungkin bisa diganti dengan echo "$currentoutput" >> test.log. Tidak ada alasan untuk menjalankan lsusblagi setelah dijalankan currentoutput=$(lsusb). Dalam kasus di mana trailing baris baru
harus dipertahankan dalam output - orang bisa melihat nilai dalam menjalankan perintah beberapa kali, tetapi dalam kasus lsusbtidak perlu untuk itu. Semakin sedikit perintah eksternal yang Anda panggil, semakin baik, karena setiap panggilan ke perintah non-built-in menimbulkan biaya dalam CPU, penggunaan memori, dan waktu eksekusi (meskipun perintah mungkin sudah dimuat sebelumnya dari memori).
Lihat juga:
while [ true ]memang menghasilkan loop tak terbatas, tetapi mungkin bukan karena alasan yang Anda pikirkan;while [ false ]juga menghasilkan loop tak terbatas, karena dengan argumen tunggal,[ ... ]berhasil jika argumen itu adalah string yang tidak kosong.while trueakan benar - benar menjalankan perintah bernamatrue(yang selalu berhasil).