在bash one liner中,我想测试
的输出someprogram --version
如果输出的前三个字符是" 2.3"然后是bash脚本 应该继续,否则返回非零
这是我尝试过的,但我可以接受其他建议
$ [[ ${`ruby --version`:0:2} == "2.3" ]]
-bash: ${`ruby --version`:0:2}: bad substitution
我正在跑步" 3.2.57(1)" bash btw。
更新:如果不使用像perl这样的东西,我可以实现我的目标,而不需要编写多行代码,而无需使用像cut这样的外部程序。
答案 0 :(得分:3)
只需使用模式匹配:
[[ "$(ruby --version)" == 2.3* ]]
答案 1 :(得分:1)
嗯,你不能把它结合在BASH中,但是你可以用管道来做cut
:
[[ $(ruby --version | cut -c 1-3) = "2.3" ]]
答案 2 :(得分:0)
使用grep,您可以保证兼容的格式:
[ "$(ruby --version |grep -Eo '[0-9]+\.[0-9]+')" = 2.3 ]
-E
适用于扩展正则表达式(在真正古老的系统上称为egrep
),我们将其用于+
,而-o
将 o nly显示匹配的文本。
但是,您无法与该方法进行比较,例如: "x≥2.3"或[[ "$(…)" -ge 2.3 ]]
)。为此,我建议awk
:
ruby --version |awk '{
split($2, V, /[^0-9]+/);
for (i in V)
if (!ver) ver = V[i] ".";
else ver = sprintf("%s%03d", ver, V[i]);
exit !(ver >= 2.003)
}'
这会输出ruby 2.3.3p123 (2017-12-15) [x86_64-linux-gnu]
之类的输出,并仅检查第二个字段(2.3.3p123
),将其拆分为A
的数组[2, 3, 3, 123]
。第一个项目按原样,后面有一个点,而其他项目零填充到三个位置。在此示例中,我们最终得到2.003003123
,这就是我将其与2.003
进行比较的原因。退出值被反转(0为真,其他数字为假),所以我反转了shell的比较。
如果你想缩短它,可以简化为:
ruby --version|awk '{split($2,A,/[^0-9]+/);for(i in A)if(!v)v=A[i]".";else v=sprintf("%s%03d",v,A[i]);exit!(v>2.003)}'
这可以运行为:if ruby --version|awk '…'; then …; fi