我在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 衍生物中使用得如此之多?它的目的是什么?
注意: 我对这个习语在bash和zsh 中的作用很感兴趣。
谢谢
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)