【问题标题】:Bash conditional assignment that tests a variable whilst building a string在构建字符串时测试变量的 Bash 条件赋值
【发布时间】:2015-10-09 13:12:44
【问题描述】:

我找到了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 中执行此操作的正确语法是什么?谢谢。

【问题讨论】:

  • 其实是C++代码

标签: bash string-concatenation conditional-operator


【解决方案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"

再想一想,我根本不会这样做,我会使用 shell 的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

【讨论】:

  • 嗯,有道理,虽然不是很可读。老实说,我很想用 if then else 语句来做。
  • 看起来好多了。有没有参考:- 构造?
  • 在我在答案中提供的链接中
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 2023-03-13
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2022-01-13
相关资源
最近更新 更多