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


34

我在《 Z-Shell用户指南》中阅读了以下内容:

'true'的同义词是':';它通常以这种形式用于提供具有副作用但不应该使用的参数-类似于

: ${param:=value}

这是所有Bourne Shell衍生物中的常见习语。在参数扩展中,$param如果之前为空,则为其赋值,否则保留该值。由于那是参数扩展的唯一原因,因此您:可以忽略该参数。实际上,shell巧妙地构建了命令行-冒号,然后跟随$paramis 的值(无论赋值是否发生),然后执行命令;碰巧':'并没有注意到它给出的参数。

但我不明白。我的:意思是true,但是表达式中有两个冒号。作为一个小问题,为什么这个习语在所有的Bourne Shell衍生物中都使用了这么多?它有什么作用?

注意: 我对该成语在bashzsh中的作用感兴趣。

谢谢


您要zsh还是bash
enzotib

@enzotib,我对两者都感兴趣。我澄清了。
Amelio Vazquez-Reina

Answers:


31

让我们将其分解成碎片。

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

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

if [ -z "$parameter_name" ]; then parameter_name=value; fi
 ${parameter_name}

换句话说,如果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

11

:并不意味着正确-您可能正在考虑while :,但是即使在该表达式中它也不意味着“真实”,它只是对它求值(实际上,它只是一个空命令或noop)。

此参数扩展(${x:=y})表示“赋值ýX如果X是未设置或清空,并扩展到ÿ ”。

$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar

Bash Hackers Wiki上有一篇很好的关于参数扩展的文章 在这里

:使用该命令的原因是,在评估该命令的其他部分时,它们不会起作用(与:null命令一样)。因此,您可以${x:=y}在不影响其他功能的情况下执行其功能,例如,如果一开始没有使用:,它将尝试执行一个名为 y

这是有关bash的帮助页面:

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

3

首先 :是命令,称为“ noop”或“ no operation”。如联机帮助页中所述,它通常用于评估参数。

第二个:是变量扩展中的限定词-从技术上讲,它是:=。如前所述,如果没有值,这将设置值。

从习惯上讲,如果您需要环境变量的默认值,则可以使用此语法。例如,通过运行程序时cron(8),未设置环境,并且外壳的点文件也未运行。因此,您可能需要设置一些默认值。

: ${JAVA_HOME:=/usr/local/jdk-1.6.0_28}

然后,您可以“设置并忘记它”(直到默认的jvm更改)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.