以下是一个简单的 shell 脚本,用于演示如何访问环境变量。
if [[ ${x+X} = X ]] ## If $x is set
then
if [[ -n $x ]] ## if $x is not empty
then
printf " \$x = %s\n" "$x"
else
printf " \$x is set but empty\n"
fi
else
printf " %s is not set\n" "\$x"
fi
然而,我对第一个“if条件”有以下疑问。
- 在 [[ 运算符内部,使用单个“=”进行比较。但是 = 不是赋值运算符吗?
- 您能解释一下“${x+X}”在此脚本中的作用吗?
答案1
{ unset x
echo ${x+"you won't see this"}
x=
echo ${x+"this you'll see"} ${x:+"and this you won't"}
x=1
echo ${x+"now you'll"} ${x:+"see it all"}
}
this you'll see
now you'll see it all
实际上,当扩展参数未设置或为 null 时,所有基本 POSIX 参数扩展的行为都不同,具体取决于:
可选的冒号修饰符。
+
参数展开的形式展开为word
当设置参数时,无论其在扩展中的内容如何:
${parameter+word}
然而,它并没有扩展到word
何时$parameter
设置但为空在下面的:
${parameter:+word}
还有-
、=
、 和 的展开形式?
。将-
扩大到word
什么$parameter
时候未设置,或者,:
当它未设置或为 null 时,使用 。的扩展方式=
与 相同-
,只是它还将 null 或 unset$parameter
的值设置为word
。并?
在编写可选内容时杀死 shellword
$parameter
未设置时向 stderr 发送错误消息,或者,:
值为空值时向 stderr 发送错误消息。对于这三者中的任何一个,如果$parameter
是set, and, with :
, 不为 null,然后$parameter
扩展为其值,就像其他情况一样。
答案2
= 不是赋值运算符吗?
是的,它是,而且它也是一个比较运算符,具体取决于它出现的位置:与许多语言一样,标记的含义取决于上下文。 Bash 支持 形式的赋值name=[value]
,以及使用表达式语言 for test
(也称为[
)和[[
; 的比较。其中,=
具有不同的含义。
什么是${x+X}
?
Bash 支持语法${parameter:+word}
:
使用替代值。如果为 null 或未设置,则不替换任何内容,否则替换
parameter
的扩展。word
在您的情况下,这意味着,如果x
未设置,则表达式将扩展到空字符串(与 的比较X
将失败),并且,如果设置了,它将扩展到X
(比较将产生 true)。
语法${parameter+word}
是 的变体${parameter:+word}
,略有不同,当parameter
设置但为空时:
x ${x+alt} ${x:+alt}
------------ ---------- ----------
unset '' ''
set to '' alt ''
non-empty alt alt