如何获取Bash版本号
我正在编写一个脚本,它需要一个简单的简短格式的Bash版本号 我知道如何获取Bash版本号,bash,shell,Bash,Shell,我正在编写一个脚本,它需要一个简单的简短格式的Bash版本号 我知道bash--version,但这会给出很长的输出: GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
bash--version
,但这会给出很长的输出:
GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
然而,无论出于何种原因,如果信息发生微小的变化,这感觉很容易中断
有没有更好的方法来做到这一点,这是什么更好的方法?似乎有一个环境变量:
echo $BASH_VERSION
屈服
4.1.7(1)-release
在我的机器上。如果在Bash shell中运行,则应设置
$Bash\u VERSION
环境变量:
$ echo $BASH_VERSION
4.2.8(1)-release
这应该更容易、更可靠地解析。有关shell设置的环境变量列表,请参见。要提取第一部分,请执行以下操作:
$ echo ${BASH_VERSION%%[^0-9.]*}
4.2.10
还有一个特殊的数组(BASH_VERSINFO),在单独的元素中包含每个版本号
if ((BASH_VERSINFO[0] < 3))
then
echo "Sorry, you need at least bash-3.0 to run this script."
exit 1
fi
基于:
要报告前3个版本号组件,例如,4.2.10
,请通过:
如果从Bash脚本内部调用此函数,请使用子shell来本地化更改IFS
的效果:
#!/usr/bin/env bash
ver=$(IFS=.; echo "${BASH_VERSINFO[*]: 0:3}") # -> e.g., $ver == '4.2.10'
说明:
将内部字段分隔符设置为IFS=。
,这样可以确保以后在双引号字符串中打印数组时,数组的元素与该分隔符连接- 请注意,您不能只执行
暂时重新定义作用域为IFS=。echo…
命令的IFS,因为shell(在本例中,echo
的扩展)发生在调用${BASH_VERSINFO[*]:0:3}
之前。因此,需要两个独立的命令;使用(echo
)可以确保对$(…)
的更改仍然是本地化的,因为命令替换在子shell中运行IFS
- 请注意,您不能只执行
从数组变量${BASH_VERSINFO[*]:0:3}
中提取前3个元素(从索引$BASH_VERSINFO
开始,返回0
元素)3
- 请注意,为了使
按预期工作,必须使用IFS
而不是*
来引用数组@
将始终使用单个空格分隔元素,而不考虑@
的值$IFS
- 请注意,为了使
bash--version
,然后其输出如下所示:
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
4.3.30(1)-release
或
或
使用Bash变量
$Bash\u版本
并运行echo$Bash\u版本
。其输出如下:
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
4.3.30(1)-release
通常我使用命令
sed
提取版本号,具体命令如下:
bash --version | sed -r -n 's@.*version (.*)\(1\)-release.*@\1@p'
例如:
[flying@lempstacker ~]$ bash --version | sed -r -n 's@.*version (.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
[flying@lempstacker ~]$ echo $BASH_VERSION | sed -r -n 's@(.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
例如:
[flying@lempstacker ~]$ bash --version | sed -r -n 's@.*version (.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
[flying@lempstacker ~]$ echo $BASH_VERSION | sed -r -n 's@(.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
在此基础上构建了一个函数,该函数只检查主版本或主版本和次版本的组合,如果当前Bash版本>=所需版本,则返回0:
check_bash_version() {
local major=${1:-4}
local minor=$2
local rc=0
local num_re='^[0-9]+$'
if [[ ! $major =~ $num_re ]] || [[ $minor && ! $minor =~ $num_re ]]; then
printf '%s\n' "ERROR: version numbers should be numeric"
return 1
fi
if [[ $minor ]]; then
local bv=${BASH_VERSINFO[0]}${BASH_VERSINFO[1]}
local vstring=$major.$minor
local vnum=$major$minor
else
local bv=${BASH_VERSINFO[0]}
local vstring=$major
local vnum=$major
fi
((bv < vnum)) && {
printf '%s\n' "ERROR: Need Bash version $vstring or above, your version is ${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}"
rc=1
}
return $rc
}
请参阅与此相关的断言:
这是对BASH_VERSINFO的其他响应的一种变体:
检查\u bash\u版本()
{
本地a=4 b=3#Bash版本>=a.b
((BASH_VERSINFO[0]>a | |\
(BASH_VERSINFO[0]==a&&BASH_VERSINFO[1]>=b))|{
echo“错误:Bash版本>=$a.$b应为。”>&2
返回1
}
}
检查|bash|u版本|退出1
。。。有了它,我发现了$BASH_VERSINFO
,我可以只用我需要的位来构建它,出于某种原因,我的机器上的手册页没有提到它设置的环境变量。谢谢:)只是主要版本:echo${BASH_version%%[^0-9]*}
echo$BASH_VERSINFO
[flying@lempstacker ~]$ echo $BASH_VERSION | sed -r -n 's@(.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
check_bash_version() {
local major=${1:-4}
local minor=$2
local rc=0
local num_re='^[0-9]+$'
if [[ ! $major =~ $num_re ]] || [[ $minor && ! $minor =~ $num_re ]]; then
printf '%s\n' "ERROR: version numbers should be numeric"
return 1
fi
if [[ $minor ]]; then
local bv=${BASH_VERSINFO[0]}${BASH_VERSINFO[1]}
local vstring=$major.$minor
local vnum=$major$minor
else
local bv=${BASH_VERSINFO[0]}
local vstring=$major
local vnum=$major
fi
((bv < vnum)) && {
printf '%s\n' "ERROR: Need Bash version $vstring or above, your version is ${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}"
rc=1
}
return $rc
}
check_bash_version 4 # Check if 4.0 or above
check_bash_version 4 2 # Check if 4.2 or above