测试bash反引号的输出

时间:2017-12-15 16:44:34

标签: string bash

在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这样的外部程序。

3 个答案:

答案 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