通过命令替换默认分配给空变量

通过命令替换默认分配给空变量

我正在尝试使用以下语法:

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给该变量。否则变量将获得值,即包含单个字符的字符串。ABACC

你可能想做的事情:

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)

相关内容