我正在阅读一个 shell 脚本,用于向某些进程添加进度条(发现这里)。我无法理解这一行(可选):
#BAR_EXT=${BAR_EXT-}
评论说这将为每个文件添加一个扩展名,也许我只需要进一步阅读,但我不熟悉 - 运算符的用法。
我知道这种替代,如在Bash 参考手册:
${parameter:-word}
我还知道上面的内容将用 替换 null 值parameter
,word
而${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-}
意思是“即使变量未设置,我也希望这会导致空字符串”,而$VARIABLE
might 意味着 or 可能意味着“我打算设置变量”。
答案3
查看最新 Bourne Shell 的手册页:
http://schillix.sourceforge.net/man/man1/bosh.1.html
并查找“参数替换”部分,该部分当前位于第 8 页。向下两页,有一个表格解释了所有可能的扩展。
Bourne Shell 在参数替换中支持的不仅仅是“-”。