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

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

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

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他の場合と同様にその値に拡張されます。

おすすめ記事