[解決済み] Bashシェルスクリプトで文字列が定義されていないかどうかを判断する方法
質問
ヌル文字列をチェックしたい場合は、次のようにします。
[ -z $mystr ]
が、変数が全く定義されていないかどうかを確認したい場合はどうすればいいのでしょうか?それとも、Bashスクリプトでは区別がないのでしょうか?
どのように解決するのですか?
あなたが求めている答えは、(明記されていないとしても)次のように暗示されていると思います。 ビンコ 's 答え とはいえ、簡単に綴られているわけではありません。 VARがセットされているが空なのか、セットされていないのかを見分けるには。
if [ -z "${VAR+xxx}" ]; then echo "VAR is not set at all"; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo "VAR is set but empty"; fi
おそらく、2行目の2つのテストを1つにまとめることができます。
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo "VAR is set but empty"; fi
しかし、Autoconf のドキュメントを読むと、'' と '' を組み合わせた用語は推奨されていないことがわかります。
-a
を使用することを推奨しています。
&&
. 問題があるシステムには出会ったことがありません。だからといって、昔は存在しなかったわけではありません(しかし、遠い昔はそうでもなかったとしても、最近では極めて稀な存在でしょう)。
これらの詳細や、その他の関連する情報については
シェルパラメータ拡張
をご覧ください。
test
または
[
コマンドと
条件式
をBashのマニュアルに記載しています。
先日、この回答についてメールで質問と一緒に質問されました。
2つのテストを使っていますが、2つ目のテストはよくわかりますが、1つ目のテストはわかりません。正確には、変数展開の必要性がわからない。
if [ -z "${VAR+xxx}" ]; then echo "VAR is not set at all"; fi
これでも同じことが実現できるのでは?
if [ -z "${VAR}" ]; then echo "VAR is not set at all"; fi
公平な質問ですが、答えは「いいえ、あなたのよりシンプルな代替案は同じことをしません」です。
あなたのテストの前に、私がこれを書いたとしましょう。
VAR=
あなたのテストでは "VAR is not set at all" と言いますが、私のテストでは(何も反響しないので暗に) "VAR is set but its value might be empty" と言うでしょう。 このスクリプトを試してみてください。
(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo "JL:1 VAR is not set at all"; fi
if [ -z "${VAR}" ]; then echo "MP:1 VAR is not set at all"; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo "JL:2 VAR is not set at all"; fi
if [ -z "${VAR}" ]; then echo "MP:2 VAR is not set at all"; fi
)
と出力されます。
JL:1 VARが全く設定されていない MP:1 VARが全く設定されていない MP:2 VARは全く設定されていない
2つ目のテストの組では、変数は設定されていますが、空の値に設定されています。 この区別は
${VAR=value}
と
${VAR:=value}
という表記になります。 同様に
${VAR-value}
と
${VAR:-value}
および
${VAR+value}
と
${VAR:+value}
といった具合に。
として
ギリ
の中で指摘しています。
回答
を実行すると
bash
と共に
set -o nounset
というオプションがある場合、上記の基本的な回答は失敗します。
unbound variable
. 簡単に改善することができます。
if [ -z "${VAR+xxx}" ]; then echo "VAR is not set at all"; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo "VAR is set but empty"; fi
をキャンセルすることもできます。
set -o nounset
オプションで
set +u
(
set -u
と同等である。
set -o nounset
).
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「ambiguous redirect」エラーが発生する
-
[解決済み] bashの文字列の等値性テストで、予期しない演算子エラーが発生するのはなぜですか?重複
-
[解決済み] Bashを使ってプログレスインジケータを表示する [重複]。
-
[解決済み] ConcatenationとAppendの違いについて【終了しました
-
[解決済み] "[0: コマンドが見つかりません]" in Bash [重複].
-
[解決済み] bashでのDiffコマンド
-
[解決済み] Bashで変数が設定されているかどうかを確認する方法は?
-
[解決済み] Bashで-zはどういう意味ですか?[重複しています]
-
[解決済み】Bashで変数が空かどうかを調べるには?
-
[解決済み] bash で "set -o nounset" を使用したときに変数が設定されているかどうかをテストする。