ฉันมักจะพยายามติดกับ POSIX sh
แทนที่จะใช้ส่วนขยายของ Bash เนื่องจากหนึ่งในประเด็นสำคัญของการเขียนสคริปต์ก็คือพกพาได้ (นอกเหนือจากการเชื่อมต่อโปรแกรมไม่ใช่การแทนที่)
ในsh
มีวิธีง่าย ๆ ในการตรวจสอบเงื่อนไข "is-prefix"
case $HOST in node*)
# Your code here
esac
เมื่อพิจารณาถึงอายุความลับและ crufty sh (และ Bash ไม่ใช่วิธีแก้ปัญหา: มันซับซ้อนกว่ามีความสอดคล้องน้อยกว่าและพกพาได้น้อยกว่า) ฉันอยากจะชี้ให้เห็นถึงหน้าที่การใช้งานที่ดีมาก: ในขณะที่องค์ประกอบไวยากรณ์เช่นcase
ในตัว การสร้างผลลัพธ์ไม่แตกต่างจากงานอื่น ๆ พวกเขาสามารถแต่งในลักษณะเดียวกัน:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
หรือแม้แต่สั้น
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
หรือแม้แต่สั้นกว่า (เพียงเพื่อนำเสนอ!
เป็นองค์ประกอบภาษา - แต่นี่เป็นสไตล์ที่ไม่ดีตอนนี้)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
ถ้าคุณชอบที่ชัดเจนสร้างองค์ประกอบภาษาของคุณเอง:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
อันนี้มันไม่ดีจริงเหรอ?
if beginswith node "$HOST"; then
# Your code here
fi
และเนื่องจากsh
เป็นเพียงงานและรายการสตริง (และกระบวนการภายใน, ซึ่งงานจะถูกประกอบขึ้น), ตอนนี้เราสามารถทำการเขียนโปรแกรมที่ใช้งานได้บางอย่าง:
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
นี่คือสง่างาม ไม่ใช่ว่าฉันจะสนับสนุนให้ใช้sh
สิ่งใดที่ร้ายแรง - มันทำลายทุกอย่างเร็วเกินไปตามข้อกำหนดของโลกแห่งความเป็นจริง (ไม่มี lambdas ดังนั้นเราต้องใช้สตริง แต่ฟังก์ชั่นการซ้อนกับสายไม่สามารถทำได้ท่อไม่สามารถทำได้ ฯลฯ )