Hal pertama yang jelas adalah Anda harus memberi jarak di antara argumen [, testatau [[:
if [ "$1" = 1 ];
Ketika berada di Bash, [[ ]]disarankan menggunakan karena tidak melakukan hal-hal yang tidak perlu untuk ekspresi kondisional seperti pemisahan kata dan perluasan nama path. Mengutip kutipan ganda juga tidak diperlukan. Operator yang lebih mudah dibaca ==juga dapat digunakan.
if [[ $1 == 1 ]];
Ditambahkan catatan: Jika operan kedua juga mengandung variabel, mengutip diperlukan karena dapat dikenakan pencocokan pola jika mengandung karakter dikenali seperti *, ?, [], dll .. Jika diperpanjang globbing atau pencocokan pola diaktifkan dengan shopt -s extglob, bentuk-bentuk lain seperti @(), !(), dll juga akan dikenali sebagai pola. Lihat Pencocokan Pola .
Dengan operator seperti <dan >mungkin masih perlu karena saya pernah menemukan bug di mana tidak mengutip argumen kedua menyebabkan hasil yang berbeda.
Sedangkan untuk operan pertama, tidak ada yang berlaku.
Pertimbangkan variasi yang lebih sederhana ini juga:
case "$1" in
1)
mv -- "${@:2}" ~/lab/Sun
;;
2)
mv -- "${@:2}" ~/lab/Moon
;;
3)
mv -- "${@:2}" ~/lab/Earth
;;
esac
Atau kental:
case "$1" in
1) mv -- "${@:2}" ~/lab/Sun ;;
2) mv -- "${@:2}" ~/lab/Moon ;;
3) mv -- "${@:2}" ~/lab/Earth ;;
esac
"${@:2}"adalah bentuk ekspansi substring atau ekspansi anggota array di mana 2offset. Ini membuat ekspansi dimulai dari nilai kedua. Dengan ini kita mungkin tidak perlu menggunakan shift.
Yang ditambahkan --mencegah mencegah mvnama file dimulai dengan tanda hubung ( -) sebagai opsi yang tidak valid.
$var,$(cmd), dan bahkan`cmd`[yang$(cmd)harus disukai]). Ada beberapa kasus tepi di mana Anda tidak perlu mengutip, tetapi selalu melakukannya tidak akan merugikan.