= 不是赋值运算符吗?

= 不是赋值运算符吗?

以下是一个简单的 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条件”有以下疑问。

  1. 在 [[ 运算符内部,使用单个“=”进行比较。但是 = 不是赋值运算符吗?
  2. 您能解释一下“${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

相关内容