有几种方法可以实现您想要的目标。
1.使用$ BASH_VERSION
仅查看$BASH_VERSION
变量中的内容就足够了。我个人将像这样使用subshell:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
请注意,<<<
here-doc的语法不可移植,如果要与一起使用/bin/sh
,则在Ubuntu上是Dash,并且在其他系统上可能是其他语法
另一种方法是通过case语句或if语句。就个人而言,我会这样做:
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退出脚本
解决该问题的一种方法就是简单地继续使用关联数组,并在bash
无法使用它们时退出。如果脚本不能使用关联数组,则set -e
下面的#!/bin/bash
行将允许脚本退出。
这将需要您明确告诉用户:“嘿,您确实需要bash 4.3版或更高版本,否则该脚本将无法工作”。然后,责任就落在用户身上,尽管有些人可能会认为这并不是真正的软件开发方法。
4.放弃所有希望,编写可移植的,符合POSIX的脚本
bash
脚本不可移植,因为其语法与Bourne Shell不兼容。如果您要编写的脚本将在一系列不同的系统上使用,而不仅仅是在Ubuntu上,那么放弃所有希望,并找到使用关联数组以外的方法的方法。这可能包括拥有两个阵列或解析配置文件。还可以考虑切换到其他语言,Perl或Python,其语法至少比bash
。
$BASH_VERSION
和$BASH_VERSINFO
变量?