我正在尝试使用以下语法:
A=${B:-C}
其中A
是变量,B
是我要分配的值,C
是 B 为空时的默认值。
现在我想B
用命令替换nc -l 443
,所以如果nc
通过端口 443 接收到一个字符串,则将其分配给变量A
,否则A
设置为默认值。我将命令写为:
A=${`nc -l 443`:-NULL}
但我收到一个错误:
-bash: A=${`nc -l 443`:-NULL}: bad substitution
我怎样才能实现这个目标?
答案1
嵌套替换在任何现代的类似 Bourne 的 shell 中都不可用,除了zsh
:
$ print -rl -- ${$(echo):-C}
C
$ print -rl -- ${$(echo 1):-C}
1
在其他外壳中:
A=$(nc -l 443)
A=${A:-C}
答案2
在 Bash 中,该行
A=${B:-C}
如果已设置且不为空,则将变量的值分配B
给该变量。否则变量将获得值,即包含单个字符的字符串。A
B
A
C
C
你可能想做的事情:
B=$( some command )
A=${B:-C}
此后,如果不为空$A
,则为 的输出,如果为some command
空,则为字符。C
答案3
如果您使用命令替换在 bash 中设置变量,则可以在命令失败时将其指定为默认值,方法如下:
uid=$(id -u root || echo NULL)
echo $uid
uid=$(id -u nosuchuser || echo NULL)
echo $uid
如果您更喜欢反引号语法:
uid=`id -u nosuchuser || echo NULL`
您可以通过将 stderr 重定向到以下方式来静默错误消息/dev/null
:
uid=$(id -u nosuchuser 2>/dev/null || echo NULL)