sh
Bash uzantılarını kullanmak yerine her zaman POSIX ile çalışmaya çalışıyorum , çünkü komut dosyalarının en önemli noktalarından biri taşınabilirliktir ( programları bağlamaktan başka , onları değiştirmekten başka).
İçinde sh
"is-prefix" koşulunu kontrol etmenin kolay bir yolu vardır.
case $HOST in node*)
# Your code here
esac
Ne kadar eski, gizemli ve acımasız sh olduğu göz önüne alındığında (ve Bash tedavi değildir: Daha karmaşık, daha az tutarlı ve daha az taşınabilir), çok güzel bir işlevsel yönü belirtmek isterim: Gibi bazı sözdizimi öğeleri case
yerleşik olsa da sonuçta ortaya çıkan yapılar diğer işlerden farklı değildir. Aynı şekilde bestelenebilirler:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
Veya daha da kısa
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
Ya da daha kısa (sadece !
bir dil öğesi olarak sunmak - ama şimdi bu kötü bir stil)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
Açık olmak istiyorsanız, kendi dil öğenizi oluşturun:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
Bu aslında pek hoş değil mi?
if beginswith node "$HOST"; then
# Your code here
fi
Ve sh
temel olarak sadece işler ve dize listeleri (ve içeriden işlerin oluşturulduğu dahili işlemler) olduğundan, şimdi bazı hafif fonksiyonel programlama bile yapabiliriz:
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
Bu zarif. sh
Ciddi bir şey için kullanmayı savunacağımdan değil - gerçek dünya gereksinimlerini çok hızlı bir şekilde kırıyor (lambda yok, bu yüzden dizeleri kullanmalıyız. Ancak dizelerle iç içe işlev çağrıları mümkün değil, borular mümkün değil, vb.)