bash - Bash:通过分组命令和布尔运算符没有 IF 的条件语句
问题描述
我试图从我的 Bash 脚本中消除“if”语法:
N=
MD='title|1.md'
这按预期工作(打印“1”和“title_1”):
if [ $(echo "$MD" | grep '|') ]; then N="${MD#*|}"; ID=${MD%|*}'_'$N; fi
echo "$N" ; echo "$ID"
这不会(打印为空):
[[ $(echo $MD | grep '|') ]] && $(N="${MD#*|}" ; ID=${MD%|*}'_'$N)
echo "$N" ; echo "$ID"
使用它运行脚本bash +x
会返回:
+ N=
++ echo 'title|1'
++ grep '|'
+ [[ -n title|1 ]]
++ N=1
++ ID=title_1
+ echo ''
+ echo ''
+ exit
有谁可以告诉我我做错了什么?谢谢。
解决方案
命令替换启动一个子shell(在这种情况下,如果有任何输出,捕获的输出将作为命令运行)。你想要一个命令组。
# Skip grep as well
[[ $MD = *\|* ]] && { N=${MD#*|}; ID=${MD%|*}_$N; }
一个正则表达式可以为你捕获每一面|
,省去MD
后面的操作。
[[ $MD =~ (.*)\|(.*) ]] && { N=${BASH_REMATCH[2]}; ID=${BASH_REMATCH[1]}_$N; }
如果您担心可读性,请不要尝试将所有内容都放在一行中。
if [[ $MD =~ (.*)\|(.*) ]]; then
N=${BASH_REMATCH[2]}
ID=${BASH_REMATCH[1]}_$N
fi
推荐阅读
- angular - 反应式表单:如何使用 Angular WITHOUT [(ngModel)] 上的 FormControl 将输入值捕获到组件内的变量中?
- java - Firestore Android分页中的ArrayIndex错误
- ruby-on-rails - 基于某些操作(如创建/更新)的 Rails 验证
- sql-server - SSIS 性能计数器
- sql-server - 将 2 列中的数据合二为一显示
- javascript - this.setState 有问题
- mysql - 如何将 csv 文件加载到 docker mysql
- python - 在数据框中查找某一行并将另一个数据框中的值输入到特定列中
- html - 这样的图片怎么排列
- button -
在按钮下标记