我正在编写一个脚本,它需要一个简单的短格式的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>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
这可以减少到我想要的位,4.2.10
,由此:
bash --version | grep "bash" | cut -f 4 -d " " | cut -d "-" -f 1 | cut -d "(" -f 1
然而,如果该消息由于某种原因而稍微改变,则感觉它容易破裂。
有没有更好的方法来做到这一点,这有什么更好的方法?
如果您在bash shell中运行,则应设置$BASH_VERSION
环境变量:
$ echo $BASH_VERSION
4.2.8(1)-release
解析这应该更容易,更可靠。有关shell设置的环境变量列表,请参阅man page。
还有一个特殊的数组(BASH_VERSINFO),包含单独元素中的每个版本号。
if ((BASH_VERSINFO[0] < 3))
then
echo "Sorry, you need at least bash-3.0 to run this script."
exit 1
fi
有关更多信息,请参阅http://www.tldp.org/LDP/abs/html/internalvariables.html:
# Bash version info:
for n in 0 1 2 3 4 5
do
echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}"
done
# BASH_VERSINFO[0] = 3 # Major version no.
# BASH_VERSINFO[1] = 00 # Minor version no.
# BASH_VERSINFO[2] = 14 # Patch level.
# BASH_VERSINFO[3] = 1 # Build version.
# BASH_VERSINFO[4] = release # Release status.
# BASH_VERSINFO[5] = i386-redhat-linux-gnu # Architecture
# (same as $MACHTYPE).
提取第一部分:
$ echo ${BASH_VERSION%%[^0-9.]*}
4.2.10
似乎有一个环境变量:
echo $BASH_VERSION
产量
4.1.7(1)-release
在我的机器上。
运行bash --version
然后它的输出喜欢
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
要么
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
要么
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
使用bash变量$BASH_VERSION
,运行echo $BASH_VERSION
,它的输出就好
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 ~]$
echo $BASH_VERSION | sed -r -n 's@(.*)\(1\)-release.*@\1@p'
例如:
[flying@lempstacker ~]$ echo $BASH_VERSION | sed -r -n 's@(.*)\(1\)-release.*@\1@p'
4.2.46
[flying@lempstacker ~]$
通过4.2.10
报告前3个版本号组件 - 例如built-in array shell variable BASH_VERSINFO
:
$ bash -c 'IFS=.; echo "${BASH_VERSINFO[*]: 0: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 ...
来暂时重新定义作为echo
命令的IFS,因为在调用parameter expansion之前发生了shell ${BASH_VERSINFO[*]: 0:3}
(echo
的扩展,在这种情况下)。因此,需要两个单独的命令;使用command substitution($(...)
)确保对IFS
的更改仍然是本地化的,因为命令替换在子shell中运行。${BASH_VERSINFO[*]: 0:3}
从数组变量$BASH_VERSINFO
中提取前3个元素(从索引0
开始,返回3
元素)。
请注意,为了使IFS
按预期工作,必须使用*
而不是@
来引用数组;无论@
的价值如何,$IFS
都会将元素分别用一个空格分开。