Gre*_*gor 13 shell bash posix variable-substitution bourne-shell
我正在查看具有以下内容的脚本:
if [ "${PS1-}" ]; then
Run Code Online (Sandbox Code Playgroud)
尾随的-
错误让我有点,因为它似乎不是 Posix 或 Bash 标准语法。这是一些永远存在的神秘语法,还是打字错误?任何对标准/文档的引用将不胜感激。
通常我会编码它:
if [ "$PS1" ]; then
Run Code Online (Sandbox Code Playgroud)
哪个更正确或者它们之间有什么区别?
Kus*_*nda 26
变量扩展${parameter:-word}
将使用$parameter
if 已设置且非空(不是空字符串)的值,否则将使用 string word
。
省略:
将不会测试该值是否为空,只会测试它是否未设置。
这意味着如果它被设置,${PS1-}
它将扩展为值$PS1
,但如果它为空或未设置,则扩展为空字符串。在这种情况下,这是完全一样的${PS1:-}
作为后弦-
也为空。
"${PS1-}"
和之间的区别"$PS1"
很微妙,正如@Rakesh Sharma 所指出的:两者都将扩展为 的值$PS1
,如果未设置,则扩展为空字符串。例外是 whenset -u
处于活动状态,在这种情况下,扩展未设置的变量会导致错误。设置的(空)默认值"${PS1-}"
绕过了这一点,将未设置扩展PS1
为空字符串而不会出错。
这是标准语法(起源于 70 年代后期的 Bourne shell),以及其他一些类似的扩展。
l0b*_*0b0 12
这绝对是POSIX 语法。释义:
使用${parameter-word}
, 如果parameter
是
parameter
,word
.示例会话:
$ echo "${parameter-word}"
word
$ parameter=
$ echo "${parameter-word}"
$ parameter=value
$ echo "${parameter-word}"
value
Run Code Online (Sandbox Code Playgroud)
“Null”在这里仅表示空字符串。例如,与 SQL 相比,POSIX shell 中没有特殊的空值。
这也记录在man bash
.
语法:
${parameter:-word}
Run Code Online (Sandbox Code Playgroud)
和一个特殊的形式:
${parameter-word}
Run Code Online (Sandbox Code Playgroud)
是POSIX shell 中的有效语法,表示word
如果parameter
未设置或为空则使用默认值。
通常, withword
为空,则:
${parameter-}
Run Code Online (Sandbox Code Playgroud)
和:
$parameter
Run Code Online (Sandbox Code Playgroud)
或者:
${parameter}
Run Code Online (Sandbox Code Playgroud)
是等价的。
但是在 的影响下set -u
,所有未设置的变量都会导致 shell 被终止。${parameter-}
用于绕过该严格规则。它适用于两种情况,所以是的,这是更正确的方法。