Saya selalu mencoba untuk tetap dengan POSIX sh
daripada menggunakan ekstensi Bash, karena salah satu poin utama dari scripting adalah portabilitas (selain menghubungkan program, bukan menggantinya).
Di sh
, ada cara mudah untuk memeriksa kondisi "is-prefix".
case $HOST in node*)
# Your code here
esac
Mengingat seberapa tua, misterius, dan kekasaran (dan Bash bukan obatnya: Ini lebih rumit, kurang konsisten, dan kurang portabel), saya ingin menunjukkan aspek fungsional yang sangat bagus: Sementara beberapa elemen sintaksis seperti case
sudah ada di dalamnya , konstruksi yang dihasilkan tidak berbeda dari pekerjaan lain. Mereka dapat disusun dengan cara yang sama:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
Atau bahkan lebih pendek
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
Atau bahkan lebih pendek (hanya untuk menyajikan !
sebagai elemen bahasa - tetapi ini adalah gaya buruk sekarang)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
Jika Anda suka secara eksplisit, buat elemen bahasa Anda sendiri:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
Bukankah ini sebenarnya cukup bagus?
if beginswith node "$HOST"; then
# Your code here
fi
Dan karena sh
pada dasarnya hanya pekerjaan dan daftar string (dan proses internal, dari mana pekerjaan terdiri), kita sekarang bahkan dapat melakukan beberapa pemrograman fungsional ringan:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # Prints TRUE
all "beginswith x" x xy abc ; checkresult # Prints FALSE
Ini elegan. Bukannya saya menganjurkan penggunaan sh
untuk sesuatu yang serius - itu rusak terlalu cepat pada persyaratan dunia nyata (tidak ada lambda, jadi kita harus menggunakan string. Tapi panggilan fungsi bersarang dengan string tidak mungkin, pipa tidak mungkin, dll.)