Bash:通过分组命令和布尔运算符不带 IF 的条件语句
Bash: Conditional Statement Without IF via Grouping Commands and Boolean Operators
我正在尝试从我的 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
吧returns:
+ 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
您可以根据分隔符 |
和 read
将字符串拆分为两个变量
$ MD='title|1.md'
$ IFS=\| read -r ID N <<< "$MD"
$ [ -n "$N" ] && ID="${ID}_${N}"
$
$ echo "$N" ; echo "$ID"
1.md
title_1.md
我正在尝试从我的 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
吧returns:
+ 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
您可以根据分隔符 |
和 read
将字符串拆分为两个变量
$ MD='title|1.md'
$ IFS=\| read -r ID N <<< "$MD"
$ [ -n "$N" ] && ID="${ID}_${N}"
$
$ echo "$N" ; echo "$ID"
1.md
title_1.md