: ${param:=value} 是什么意思?

Ame*_*ina 39 shell bash zsh

我在A User's Guide to the Z-Shell 中阅读了以下内容:

'true' 的同义词是 ':'; 它经常以这种形式用于给出有副作用但不应该使用的参数——比如

: ${param:=value}
Run Code Online (Sandbox Code Playgroud)

这是所有 Bourne shell 衍生物中的常见习语。在参数扩展中,$param如果之前为空则给定值 value,否则不理会。由于这是参数扩展的唯一原因,因此您:习惯于忽略该参数。实际上,shell 轻松地构建了命令行——冒号,后跟任何值$param,无论赋值是否发生——然后执行命令;碰巧 ':' 没有注意到它给出的参数。

但我不明白。我明白这:意味着true,但表达式中有两个冒号。作为一个小问题,为什么这个习语在所有 Bourne shell 衍生物中使用得如此之多?它的目的是什么?

注意: 我对这个习语在bashzsh 中的作用很感兴趣。

谢谢

Gil*_*il' 37

让我们把它分解成碎片。

此代码运行:带有一些参数的命令。该命令:不执行任何操作并忽略其参数。因此,整个命令行什么都不做,除了参数中发生的任何副作用。

该语法${parameter_name:=value}存在于所有非古董 Bourne 风格的 shell 中,包括 ash、bash、ksh 和 zsh。如有必要,它将参数设置为默认值。它相当于

if [ -z "$parameter_name" ]; then parameter_name=value; fi
… ${parameter_name}
Run Code Online (Sandbox Code Playgroud)

换句话说,如果parameter_name没有设置或设置为空值,则设置为指示值;然后使用新的参数值运行命令。有一个变体 ,${parameter_name=value}如果参数为空,则将参数留空,仅在参数未设置时才使用指示的值。

您会在POSIX 规范以及 dash、bash、ksh 和 zsh 手册中“参数扩展”下找到此语法。

此语法有多种变体,特别${parameter_name:-value}是允许您仅为此扩展使用默认值,而无需分配给参数。

总之,: ${parameter_name:=value}是一种简洁的写作方式

if [ -z "$parameter_name" ]; then parameter_name=value; fi
Run Code Online (Sandbox Code Playgroud)


Chr*_*own 13

:并不意味着 true - 您可能会想到while :,但即使在该表达式中它也不意味着“true”,它只是碰巧对它求值(实际上,它只是一个空命令或 noop)。

此参数扩展 ( ${x:=y}) 表示“如果x未设置或为空,则将y分配给x,并扩展x的最终值”。

$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar
Run Code Online (Sandbox Code Playgroud)

Bash Hackers wiki 在此处有一篇关于参数扩展的好文章。

使用的原因:是,当评估命令的其他部分时,它们不会被执行(如:空命令)。因此,您可以${x:=y}在不影响其他任何东西的情况下执行其功能,例如,如果您:在开始时没有 ,它将尝试执行名为y的命令。

这是bash帮助页面:

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
Run Code Online (Sandbox Code Playgroud)