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 $IFS
variabel shell default ).
Sebagai contoh,
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
Di sini kita mendefinisikan howmany
fungsi 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 $var
variabel,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 hello
dan world
diikuti 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 df
output 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 true
gunakan perintah true
yang selalu mengembalikan status keluar sukses (dan itulah yang while
dibutuhkan loop). Perbedaannya sedikit lebih jelas dan sedikit pengujian yang dilakukan. Atau, Anda juga bisa menggunakan :
bukannyatrue
Kutipan ganda echo "" date and Time
sebagian 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 lsusb
lagi 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 lsusb
tidak 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 true
akan benar - benar menjalankan perintah bernamatrue
(yang selalu berhasil).