[解決済み] Bashで変数が設定されているかどうかを確認する方法は?
質問
Bashで変数が設定されているかどうかを知るにはどうすればよいですか?
例えば、ユーザーがある関数の最初のパラメータを与えたかどうかを確認するにはどうすればよいですか?
function a {
# if $1 is set ?
}
解決方法は?
(通常) 正しい方法
if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi
ここで
${var+x}
は
パラメータ展開
の場合、何も評価されません。
var
が設定されていない場合は、文字列
x
でなければ
引用元: 余談
引用は省略可能です。
${var+x}
ではなく
"${var+x}"
に展開されるため)、この構文& 用法では、引用符を必要としないものにのみ展開されることが保証されています。
x
(これは単語の区切りを含まないので引用符は不要)、または何もしない(その結果は
[ -z ]
と同じ値 (true) に評価されます。
[ -z "" ]
もそうです))。
しかし、引用符は安全に省略することができ、すべての人にすぐにわかるものではありませんでしたが(それは
この引用の説明の最初の著者は
のように引用符で囲んで解答を書いた方が良い場合があります。
[ -z "${var+x}" ]
しかし、その代償としてO(1)の速度ペナルティが発生する可能性があります。 筆者もこの解答を使ったコードの横にコメントとして追加し、この解答へのURLを示しました。このコメントには、引用符を省略しても安全である理由の説明も含まれています。
(よくある) 間違った方法
if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi
これは、設定されていない変数と、空の文字列が設定されている変数を区別していないため、間違っていることが多いのです。つまり、もし
var=''
であれば、上記の解答は "var is blank" を出力します。
unset と "set to empty string" の区別は、ユーザーが拡張機能や追加プロパティのリストを指定しなければならない状況で、それらを指定しないと空でない値がデフォルトとなり、一方、空文字列を指定するとスクリプトが空の拡張機能や追加プロパティのリストを使用するようになるため、重要です。
しかし、この区別はすべてのシナリオで必須とは限りません。そのような場合には
[ -z "$var" ]
がちょうどよいでしょう。
関連
-
[解決済み] openstack の google-chrome-stable ubuntu12 パッケージが見つかりません。
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Bashで変数で定義された数値の範囲を反復処理するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】シェルスクリプトで整数式が期待されるエラーが発生する
-
[解決済み】Bashのif条件で「unary operator expected」エラーが発生する。
-
[解決済み】bashでjsonファイルを解析するために、jqの出力にあるダブルクオートを削除する方法は?
-
[解決済み] bashスクリプトでタブ文字をエコーする
-
[解決済み] bash スクリプトの "${BASH_SOURCE[0]}" と $( cd $( dirname "xxx" && pwd )) の意味について
-
[解決済み] Bashを使ってプログレスインジケータを表示する [重複]。
-
[解決済み] プロジェクトからすべての .pyc ファイルを削除するにはどうすればよいですか?
-
[解決済み] 環境変数を表示/エコーするには?
-
[解決済み] bashの"-ne "はどういう意味ですか?
-
[解決済み】環境変数が存在するかどうかを確認し、その値を取得する方法は?重複