Bash命令以冒号开头,另一个冒号在等号之前

tol*_*ira 6 bash colon

我找不到任何可以解释下面语法的文档.它在bash脚本中做了什么?这是考试吗?

: ${foo:=bar}; export foo
Run Code Online (Sandbox Code Playgroud)

Eta*_*ner 6

:命令是null实用程序:

该实用程序只应扩展命令参数.它在需要命令时使用,如if命令的then条件,但命令不执行任何操作.

还有Bourne Shell Builtins:

除了扩展参数和执行重定向之外什么都不做.返回状态为零.

${foo:=bar}语法是一个特殊的参数扩展:

${parameter:=[word]}
Run Code Online (Sandbox Code Playgroud)

分配默认值.如果参数未设置或为null,则应将字的扩展(如果省略字,则为空字符串)分配给参数.在所有情况下,参数的最终值应替换.只能以这种方式分配变量,而不是位置参数或特殊参数.

Bash参考手册条目:

${parameter:=word}
Run Code Online (Sandbox Code Playgroud)

如果参数未设置或为null,则将字的扩展分配给参数.然后替换参数的值.不能以这种方式分配位置参数和特殊参数.

所以你问题中的命令行:

: ${foo:=bar}; export foo
Run Code Online (Sandbox Code Playgroud)

有两个命令:

  1. : ${foo:=bar}
  2. export foo

第一个扩展变量foo,如果它为空或未设置,则赋值bar.

然后,第二个导出foo子shell和其他进程的变量.

  • 它是.扩展`$ {foo:= bar}`将扩展为`foo`或字符串`bar`的值.`bar`不太可能是一个有效的命令,`foo`的内容可能是*任何*.如果没有null命令,shell将尝试执行扩展的结果.而且,充其量,它会出错.在最坏的情况下,它会擦除​​整个系统(即如果`foo ='rm -rf /'`). (2认同)