回答:
#!/bin/bash
set -o nounset
VALUE=${WHATEVER:-}
if [ ! -z ${VALUE} ];
then echo "yo"
fi
echo "whatever"
この場合、VALUE
が設定されていないと、空の文字列になりますWHATEVER
。「パラメータの展開」で{parameter:-word}
検索できる展開を使用していますman bash
。
:-
変数が設定されていないか空かをチェックします。設定されていないかどうかだけを確認したい場合は、を使用し-
ますVALUE=${WHATEVER-}
。また、変数が空かどうかを確認するより読みやすい方法:if [ "${WHATEVER+defined}" = defined ]; then echo defined; else echo undefined; fi
$WHATEVER
空白のみが含まれている場合、これは機能しません-私の回答を参照してください。
! -z
」だけでなく「」を使用する理由はあり-n
ますか?
期待する結果を得るには、変数を引用符で囲む必要があります。
check() {
if [ -n "${WHATEVER-}" ]
then
echo 'not empty'
elif [ "${WHATEVER+defined}" = defined ]
then
echo 'empty but defined'
else
echo 'unset'
fi
}
テスト:
$ unset WHATEVER
$ check
unset
$ WHATEVER=
$ check
empty but defined
$ WHATEVER=' '
$ check
not empty
"info bash"
、"${WHATEVER-}"
持っていなければならない":"
前に(コロン)"-"
:のように(ダッシュ)"${WHATEVER:-}"
、そして"${WHATEVER+defined}"
前にコロンが必要"+"
(プラス)などを:"${WHATEVER:+defined}"
。私にとっては、コロンの有無にかかわらず、どちらの方法でも機能します。'nixの一部のバージョンでは、コロンを含めないと機能しない可能性があるため、おそらく追加する必要があります。
-
、+
、:+
、および:-
すべてのサポートされています。前者は変数が設定されているかどうかを検出し、後者は設定されているか空かを検出します。From man bash
:「コロンを省略すると、設定されていないパラメーターに対してのみテストが行われます。」
ワンライナーはどうですか?
[ -z "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"
-z
空または未設定の変数の両方をチェックします
-z
次のパラメータが空であるかどうかを確認するだけです。-z
isは[
コマンドの単なる引数です。変数の展開[ -z
は、何でもできる前に行われます。
仮定:
$ echo $SHELL
/bin/bash
$ /bin/bash --version | head -1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
$ set -o nounset
非インタラクティブスクリプトでエラーを出力し、変数がnullまたは設定されていない場合に終了する場合:
$ [[ "${HOME:?}" ]]
$ [[ "${IAMUNBOUND:?}" ]]
bash: IAMUNBOUND: parameter null or not set
$ IAMNULL=""
$ [[ "${IAMNULL:?}" ]]
bash: IAMNULL: parameter null or not set
スクリプトを終了させたくない場合:
$ [[ "${HOME:-}" ]] || echo "Parameter null or not set."
$ [[ "${IAMUNBOUND:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.
$ IAMNULL=""
$ [[ "${IAMUNNULL:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.
[
andの]
代わりに[[
andを使用することもできます]]
、Bashでは後者が推奨されます。
コロンが上で何をするかに注意してください。ドキュメントから:
言い換えると、コロンが含まれている場合、演算子は両方のパラメーターの存在と、その値がnullではないことをテストします。コロンが省略されている場合、オペレーターは存在のみをテストします。
明らかに必要が-n
ないか、-z
です。
要約すると、私は通常、単にを使用します[[ "${VAR:?}" ]]
。例ごとに、これはエラーを出力し、変数がnullまたは設定されていない場合に終了します。
使用できます
if [[ ${WHATEVER:+$WHATEVER} ]]; then
だが
if [[ "${WHATEVER:+isset}" == "isset" ]]; then
より読みやすいかもしれません。
=
演算子を使用する必要があります。==
[
[[
set -o nounset
ます。#!/bin/bash
スクリプトの先頭にaを置く場合、実際にはbashの拡張機能を使用するのが最善です。