以下は、環境変数にアクセスする方法を示す単純なシェルスクリプトです。
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
実際、すべてのデフォルトのPOSIXパラメータ拡張は、オプションの:
コロン修飾子に従って拡張パラメータが設定されていないか、またはnullの場合、動作が異なります。
+
パラメータ拡張形式は次のように拡張されます。word
拡張の内容に関係なくパラメータを設定するとき:
${parameter+word}
しかし、次に拡張されるわけではありません。word
$parameter
設定時期しかし空以下から:
${parameter:+word}
-
、、、=
の拡張された形もあります?
。-
に拡張される予定です。word
$parameter
いつ未設定、または:
設定されていない、またはnullの場合に使用されます。 null または unset の値を次のように設定する点を除いて、=
同じ方法で拡張されます。-
$parameter
word
。?
オプションの作成中にシェルを終了します。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