Có vài cách để tiếp cận những gì bạn muốn đạt được.
1. Sử dụng $ BASH_VERSION
Chỉ cần nhìn thấy những gì trong $BASH_VERSION
biến. Cá nhân tôi sẽ sử dụng subshell như vậy:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Lưu ý rằng <<<
cú pháp cho tài liệu ở đây không khả dụng, nếu bạn sẽ sử dụng nó với /bin/sh
Dash, đó là Dash trên Ubuntu và có thể là một thứ khác trên một hệ thống khác
Cách khác là thông qua tuyên bố trường hợp hoặc nếu tuyên bố. Cá nhân, tôi sẽ làm điều này:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
Có lẽ vì lợi ích của tính di động, có lẽ bạn nên kiểm tra xem biến đó thậm chí có được đặt ở vị trí đầu tiên với thứ gì đó như không [ -n $BASH_VERSION ]
Điều này hoàn toàn có thể được viết lại như là chức năng được sử dụng trong một kịch bản. Một cái gì đó dài dòng:
#!/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
Đây không phải là một lót, mặc dù điều này là tốt hơn nhiều. Chất lượng hơn số lượng.
2. Kiểm tra những gì đã cài đặt
Cho rằng bạn cần phải lọc đầu ra apt-cache policy
như vậy
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
cũng có thể có ích với một số bộ lọc thông qua awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Lưu ý rằng đây không phải là thiết bị di động, vì nếu không có dpkg
hoặc apt
được cài đặt trên một hệ thống (ví dụ: RHEL hoặc FreeBSD), thì nó sẽ không giúp ích gì cho bạn.
3. Sử dụng set -e để thoát tập lệnh nếu có lỗi
Một cách để khắc phục nó chỉ đơn giản là đi trước một mảng kết hợp sử dụng và thoát ra khi bash
không thể sử dụng chúng. set -e
dòng bên dưới #!/bin/bash
sẽ cho phép tập lệnh thoát nếu tập lệnh không thể sử dụng mảng kết hợp.
Điều này sẽ yêu cầu bạn nói rõ ràng với người dùng: "Này, bạn thực sự cần bash phiên bản 4.3 trở lên, nếu không kịch bản sẽ không hoạt động". Sau đó, trách nhiệm thuộc về người dùng, mặc dù một số người có thể lập luận rằng đây không thực sự là một cách tiếp cận tốt để phát triển phần mềm.
4. Từ bỏ mọi hy vọng và viết các tập lệnh di động, tuân thủ POSIX
bash
tập lệnh không khả dụng vì cú pháp của nó không tương thích với shell Bourne. Nếu tập lệnh mà bạn đang viết sẽ được sử dụng trên một loạt các hệ thống khác nhau, không chỉ riêng Ubuntu, thì hãy từ bỏ mọi hy vọng và tìm cách sử dụng thứ gì đó ngoài mảng kết hợp. Điều đó có thể bao gồm có hai mảng hoặc phân tích tệp cấu hình. Cũng xem xét chuyển sang một ngôn ngữ khác, Perl hoặc Python, trong đó cú pháp ít nhất là dễ mang theo hơn bash
.
$BASH_VERSION
và$BASH_VERSINFO
các biến?