มีสองวิธีในการเข้าถึงสิ่งที่คุณต้องการบรรลุ
1. ใช้ $ BASH_VERSION
มันเพียงพอแล้วที่จะเห็นว่ามีอะไรอยู่ใน$BASH_VERSION
ตัวแปร โดยส่วนตัวฉันจะใช้ subshell อย่างเช่น:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
โปรดทราบว่า<<<
ไวยากรณ์สำหรับ here-doc ไม่ใช่แบบพกพาหากคุณจะใช้กับ/bin/sh
ซึ่งเป็น Dash บน Ubuntu และอาจเป็นอย่างอื่นในระบบอื่น
ทางเลือกคือผ่านคำสั่งกรณีหรือถ้าคำสั่ง โดยส่วนตัวฉันจะทำสิ่งนี้:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
อาจจะเป็นเพราะการพกพาคุณอาจจะต้องตรวจสอบว่าตัวแปรนั้นถูกตั้งค่าไว้ตั้งแต่แรกด้วยบางอย่างเช่น [ -n $BASH_VERSION ]
ทั้งหมดนี้สามารถเขียนใหม่เป็นฟังก์ชันที่จะใช้ในสคริปต์ บางสิ่งมีความยาวเป็น:
#!/bin/bash
version_above_4(){
# check if $BASH_VERSION is set at all
[ -z $BASH_VERSION ] && return 1
# If it's set, check the version
case $BASH_VERSION in
4.*) return 0 ;;
?) return 1;;
esac
}
if version_above_4
then
echo "Good"
else
echo "No good"
fi
นี่ไม่ใช่หนึ่งซับแม้ว่าจะดีกว่ามาก คุณภาพอยู่เหนือปริมาณ.
2. ตรวจสอบสิ่งที่ติดตั้ง
เพื่อที่คุณจะต้องกรองเอาท์พุทของapt-cache policy
เช่นนั้น
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
awk
นอกจากนี้ยังสามารถเข้ามามีประโยชน์กับบางกรองผ่าน
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
โปรดทราบว่านี่ไม่ใช่การพกพาเนื่องจากหากไม่มีdpkg
หรือapt
ติดตั้งในระบบ (เช่น RHEL หรือ FreeBSD) ระบบจะไม่ทำสิ่งใดให้คุณ
3. ใช้ set -e เพื่อออกจาก script หากมีข้อผิดพลาด
วิธีหนึ่งในการหลีกเลี่ยงมันก็คือการใช้อาเรย์แบบเชื่อมโยงและเลิกใช้เมื่อbash
ไม่สามารถใช้งานได้ set -e
บรรทัดด้านล่าง#!/bin/bash
จะอนุญาตให้สคริปต์ออกหากสคริปต์ไม่สามารถใช้อาเรย์แบบเชื่อมโยงได้
สิ่งนี้จะทำให้คุณต้องบอกผู้ใช้อย่างชัดเจนว่า: "เฮ้คุณต้องทุบตีเวอร์ชั่น 4.3 ขึ้นไปมิฉะนั้นสคริปต์จะไม่ทำงาน" ความรับผิดชอบนั้นขึ้นอยู่กับผู้ใช้แม้ว่าบางคนอาจแย้งว่านี่ไม่ใช่วิธีที่ดีในการพัฒนาซอฟต์แวร์
4. ละทิ้งความหวังและเขียนสคริปต์แบบพกพาที่สอดคล้องกับ POSIX
bash
สคริปต์ไม่สามารถเคลื่อนย้ายได้เนื่องจากไวยากรณ์ไม่สามารถทำงานร่วมกับ Bourne shell ได้ หากสคริปต์ที่คุณกำลังเขียนจะถูกนำไปใช้กับระบบที่แตกต่างกันไม่ใช่เฉพาะ Ubuntu เพียงอย่างเดียวให้ละทิ้งความหวังทั้งหมดและหาวิธีใช้สิ่งอื่นนอกเหนือจากอาร์เรย์เชื่อมโยง ซึ่งอาจรวมถึงการมีสองอาร์เรย์หรือแยกไฟล์การกำหนดค่า ยังพิจารณาเปลี่ยนไปใช้ภาษาที่แตกต่างกัน, Perl bash
หรืองูหลามที่ไวยากรณ์อย่างน้อยกว่าแบบพกพา
$BASH_VERSION
และ$BASH_VERSINFO
ตัวแปรหรือไม่