Bash条件赋值,用于在构建字符串时测试变量

时间:2015-10-09 13:12:45

标签: bash string-concatenation conditional-operator

我发现了this question关于如何在bash中进行条件赋值,但我想要做的是稍微复杂一点,我似乎无法正确理解语法。在我的情况下,条件是测试变量以查看它是否存在,并将输出连接到字符串。

这是我到目前为止所拥有的:

fwversion="${BASH_REMATCH[1]}.$(( [[ BASH_REMATCH[2] ]] ? BASH_REMATCH[2] : 0 ))"

产生此错误消息:

bash: line 41: [[ BASH_REMATCH[2] ]] ? BASH_REMATCH[2] : 0 : syntax error: 
operand expected (error token is "[[ BASH_REMATCH[2] ]] ? BASH_REMATCH[2] : 0 ")

这就是我想要实现的C ++代码:

std::string fwversion = BASH_REMATCH[1] + "." + ((BASH_REMATCH[2]) ? : BASH_REMATCH[2] : 0);

在bash中执行此操作的正确语法是什么?感谢。

1 个答案:

答案 0 :(得分:1)

在算术表达式中似乎无法理解[[ ... ]]

我这样做:

fwversion=${BASH_REMATCH[1]}
[[ ${BASH_REMATCH[2]} ]] && fwversion+=${BASH_REMATCH[2]} || fwversion+=0

[[ ${BASH_REMATCH[2]} ]] && ext=${BASH_REMATCH[2]} || ext=0
fwversion="${BASH_REMATCH[1]}.$ext"

第二个想法,我根本不会这样做,我会使用贝壳的力量parameter expansion

str="foo:bar"
if [[ $str =~ ^([a-z]+):([a-z]*)$ ]]; then
    echo "${BASH_REMATCH[1]}.${BASH_REMATCH[2]:-0}"
fi
foo.bar
str="foo:"
if [[ $str =~ ^([a-z]+):([a-z]*)$ ]]; then
    echo "${BASH_REMATCH[1]}.${BASH_REMATCH[2]:-0}"
fi
foo.0