มีสองวิธีในการเข้าถึงสิ่งที่คุณต้องการบรรลุ
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-queryawkนอกจากนี้ยังสามารถเข้ามามีประโยชน์กับบางกรองผ่าน
$ 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ตัวแปรหรือไม่