Ada dua kasus yang menurut saya :
berguna:
Tugas variabel default
#!/bin/sh
# set VAR to "default value" if not already set in the environment
: "${VAR=default value}"
# print the value of the VAR variable. Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR}"
Ini adalah cara yang mudah untuk memungkinkan pengguna skrip shell Anda menimpa pengaturan tanpa mengedit skrip. (Namun, argumen baris perintah lebih baik karena Anda tidak menjalankan risiko perilaku tak terduga jika pengguna secara kebetulan memiliki variabel yang Anda gunakan di lingkungan yang diekspor.) Berikut ini cara pengguna akan menimpa pengaturan:
VAR="other value" ./script
The ${VAR=value}
sintaks mengatakan untuk set VAR
ke value
jikaVAR
belum diatur, kemudian memperluas dengan nilai variabel. Karena kita belum peduli tentang nilai variabel, itu dilewatkan sebagai argumen pada perintah no-op :
untuk membuangnya.
Meskipun :
perintah no-op, ekspansi dilakukan oleh shell (bukan:
perintah!) Sebelum menjalankan :
perintah sehingga penugasan variabel tetap terjadi (jika berlaku).
Ini juga dapat diterima untuk menggunakan true
atau perintah lain sebagai gantinya:
, tetapi kode menjadi lebih sulit dibaca karena maksudnya kurang jelas.
Skrip berikut juga berfungsi:
#!/bin/sh
# print the value of the VAR variable. Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR=default value}"
Tetapi hal di atas jauh lebih sulit untuk dipertahankan. Jika baris menggunakan ${VAR}
ditambahkan di atas printf
garis itu, perluasan tugas default harus dipindahkan. Jika pengembang lupa untuk memindahkan tugas itu, bug diperkenalkan.
Sesuatu untuk dimasukkan ke dalam blok bersyarat kosong
Blok bersyarat kosong umumnya harus dihindari, tetapi kadang-kadang berguna:
if some_condition; then
# todo: implement this block of code; for now do nothing.
# the colon below is a no-op to prevent syntax errors
:
fi
Beberapa orang berpendapat bahwa memiliki if
blok benar kosong dapat membuat kode lebih mudah dibaca daripada meniadakan tes. Sebagai contoh:
if [ -f foo ] && bar || baz; then
:
else
do_something_here
fi
bisa dibilang lebih mudah dibaca daripada:
if ! [ -f foo ] || ! bar && ! baz; then
do_something_here
fi
Namun saya percaya ada beberapa pendekatan alternatif yang lebih baik daripada blok kosong yang benar:
Masukkan kondisi dalam suatu fungsi:
exotic_condition() { [ -f foo ] && bar || baz; }
if ! exotic_condition; then
do_something_here
fi
Masukkan kondisi di dalam kurung kurawal (atau tanda kurung, tetapi kurung menelurkan proses subkulit dan perubahan apa pun yang dilakukan terhadap lingkungan di dalam subkulit tidak akan terlihat di luar subkulit) sebelum meniadakan:
if ! { [ -f foo ] && bar || baz; } then
do_something_here
fi
Gunakan ||
alih-alih if
:
[ -f foo ] && bar || baz || {
do_something_here
}
Saya lebih suka pendekatan ini ketika reaksinya sederhana, seperti menyatakan kondisi:
log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$@"; exit 1; }
[ -f foo ] && bar || baz || fatal "condition not met"