Bourne shell:参数替换中的尾随“-”运算符

Bourne shell:参数替换中的尾随“-”运算符

我正在阅读一个 shell 脚本,用于向某些进程添加进度条(发现这里)。我无法理解这一行(可选):

#BAR_EXT=${BAR_EXT-}

评论说这将为每个文件添加一个扩展名,也许我只需要进一步阅读,但我不熟悉 - 运算符的用法。

我知道这种替代,如在Bash 参考手册:

${parameter:-word}

我还知道上面的内容将用 替换 null 值parameterword${parameter-word}不会。 (至少,我想我知道这一点。)

但这里之后没有指定任何内容-,我不确定发生了什么。这会简单地替换parameter为空值吗?一般来说,我会接受这是一个工作猜测并继续阅读,但评论提到添加文件的扩展名。

答案1

脚本中是否包含命令set -u?这意味着

执行参数扩展时,将未设置的变量和除特殊参数“@”和“*”之外的参数视为错误。如果尝试对未设置的变量或参数进行扩展,shell 会打印一条错误消息,并且如果不是交互式的,则会以非零状态退出。

换句话说,如果$BAR_EXT没有设置,类似

BAR_FILE="$BAR_FILE$BAR_EXT"

会失败的。命令

BAR_EXT=${BAR_EXT-}

$BAR_EXT如果根本没有定义,将显式设置为空字符串,从而避免此类错误。

答案2

${VARIABLE-}VARIABLE如果已设置,则扩展为 的值,否则扩展为空字符串。这通常是直人$VARIABLE所做的。然而,当选项set -u( set -o nounset) 打开,$VARIABLE当变量未设置时会触发错误,但${VARIABLE-}仍会生成空字符串。 So 的${VARIABLE-}意思是“即使变量未设置,我也希望这会导致空字符串”,而$VARIABLEmight 意味着 or 可能意味着“我打算设置变量”。

答案3

查看最新 Bourne Shell 的手册页:

http://schillix.sourceforge.net/man/man1/bosh.1.html

并查找“参数替换”部分,该部分当前位于第 8 页。向下两页,有一个表格解释了所有可能的扩展。

Bourne Shell 在参数替换中支持的不仅仅是“-”。

相关内容