=は割り当て演算子ではありませんか?

=は割り当て演算子ではありませんか?

以下は、環境変数にアクセスする方法を示す単純なシェルスクリプトです。

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

実際、すべてのデフォルトのPOSIXパラメータ拡張は、オプションの:コロン修飾子に従って拡張パラメータが設定されていないか、またはnullの場合、動作が異なります。

+パラメータ拡張形式は次のように拡張されます。word拡張の内容に関係なくパラメータを設定するとき:

${parameter+word}

しかし、次に拡張されるわけではありません。word$parameter設定時期しかし空以下から:

${parameter:+word}

-、、、=の拡張された形もあります?-に拡張される予定です。word$parameterいつ未設定、または:設定されていない、またはnullの場合に使用されます。 null または unset の値を次のように設定する点を除いて、=同じ方法で拡張されます。-$parameterword?オプションの作成中にシェルを終了します。word$parameter設定されていない場合はstderrにエラーメッセージを送信し、:値がNULLの場合はstderrにエラーメッセージを送信します。これら3つのうちの1つが該当する場合$parameter はいset と with は:null ではなく、$parameter他の場合と同様にその値に拡張されます。

答え2

=は割り当て演算子ではありませんか?

はい、そうです。表示される位置によっては比較演算子でもあります。多くの言語と同様に、トークンの意味は状況によって異なります。 Bashは公式の割り当てname=[value]だけでなく、test(とも呼ばれる)[[[;の表現言語を使用した比較もサポートします。異なる意味を持っています=

何ですか${x+X}

Bashは構文をサポートしています${parameter:+word}

代替値を使用してください。 null または設定されていない場合は何も置き換えられず、そうでない場合はparameter拡張が置き換えられます。word

あなたの場合、これはx設定されていない場合は式が空の文字列に展開され(比較がX失敗する)、設定されている場合は空の文字列に展開されますX(比較が真になる)ことを意味します。

構文は設定されていますが空の場合は若干異なる${parameter+word}バリエーションです。${parameter:+word}parameter

x            ${x+alt}   ${x:+alt}
------------ ---------- ----------
unset                ''         ''
set to ''           alt         ''
non-empty           alt        alt

関連情報