Saya selalu mencoba untuk tetap dengan POSIX shdaripada 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 casesudah 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 shpada 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 shuntuk 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.)