วิธีง่ายๆในการตรวจสอบว่าสตริงมีอักขระในชุดที่ได้รับอนุญาตเท่านั้นคือการทดสอบว่ามีอักขระที่ไม่ได้รับอนุญาตหรือไม่ ดังนั้นแทนที่จะทดสอบว่าสตริงมีช่องว่างหรือไม่เท่านั้นทดสอบว่าสตริงมีอักขระบางตัวที่ไม่ใช่ช่องว่างหรือไม่ ใน bash, ksh หรือ zsh:
if [[ $param = *[!\ ]* ]]; then
echo "\$param contains characters other than space"
else
echo "\$param consists of spaces only"
fi
“ ประกอบด้วยช่องว่างเท่านั้น” รวมถึงกรณีของตัวแปรว่างเปล่า (หรือไม่ได้ตั้งค่า)
คุณอาจต้องการทดสอบอักขระช่องว่างใด ๆ ใช้[[ $param = *[^[:space:]]* ]]
เพื่อใช้การตั้งค่าโลแคลหรือรายการอักขระช่องว่างที่ชัดเจนที่คุณต้องการทดสอบเช่น[[ $param = *[$' \t\n']* ]]
เพื่อทดสอบช่องว่างแท็บหรือการขึ้นบรรทัดใหม่
การจับคู่สตริงกับรูปแบบที่มี=
ภายใน[[ … ]]
เป็นส่วนขยาย ksh (ยังมีอยู่ใน bash และ zsh) ในสไตล์ Bourne / POSIX คุณสามารถใช้case
โครงสร้างเพื่อจับคู่สตริงกับรูปแบบ โปรดทราบว่ารูปแบบเชลล์มาตรฐานใช้!
เพื่อคัดค้านชุดอักขระแทนที่จะ^
ชอบในไวยากรณ์นิพจน์ทั่วไปส่วนใหญ่
case "$param" in
*[!\ ]*) echo "\$param contains characters other than space";;
*) echo "\$param consists of spaces only";;
esac
ในการทดสอบอักขระช่องว่าง$'…'
ไวยากรณ์จะใช้เฉพาะกับ ksh / bash / zsh; คุณสามารถแทรกอักขระเหล่านี้ในสคริปต์ของคุณอย่างแท้จริง (โปรดทราบว่าการขึ้นบรรทัดใหม่จะต้องอยู่ในเครื่องหมายคำพูดเนื่องจากเครื่องหมายแบ็กสแลช + การขึ้นบรรทัดใหม่จะขยายเป็นไม่มีอะไรเลย) หรือสร้างเช่น
whitespace=$(printf '\n\t ')
case "$param" in
*[!$whitespace]*) echo "\$param contains non-whitespace characters";;
*) echo "\$param consists of whitespace only";;
esac
man test
-z STRING - the length of STRING is zero
หากคุณต้องการลบช่องว่างทั้งหมด$param
ให้ใช้${param// /}