今回は変数の高度な使い方
「パラメータ展開
(parameter expansion)」
を学ぶよ!
これまでだけでも
結構高度だと思っていたけど
まだまだ上があるんだね…
${変数名:=文字列}
最初は「デフォルト値の代入」だよ
${変数名=文字列}
これは
変数名
の変数が未定義のとき変数に 文字列
を代入して宣言した上でその変数の値を展開してくれるんだまた 「未定義」か「値が空」のときに 同様の処理をしてくれるよ
=
の代わりに :=
とすると変数名
の変数が${変数名:=文字列}
:
)」すごそうだけど…どうやって使えばいいのかな?
このような例はどうだろう?
#!/bin/bash
echo -n "名前を入力して下さい: "
read NAME
echo "こんにちは、${NAME:=名無しの権兵衛}さん!"
なるほど!
read
の入力にそのまま Enter だけ押したらNAME
変数の値は空になるねそして表示のときに「名無しの権兵衛」を代入して 「こんにちは、名無しの権兵衛さん!」 と表示してくれるんだ!
NAME
が空だったら値にそういうことだよ便利でしょ?
${変数名:-文字列}
次は「デフォルト値の表示」だよ
${変数名:-文字列}
これは 「未定義」か「値が空」のときに
変数名
の変数が文字列
を表示してくれるんだそうでない場合は変数名
の値を表示するよこれは
=
のときのように変数への代入はしないんだわざわざ代入を避けるのはどんなときなのかな?
読み取り専用変数などに使われるよ位置変数
$1
などでよく使われるね使っている例を見せて欲しいなぁ
こういうのでどうだろう?
#!/bin/bash
引数が必要なコマンド "${1:-default}"
シェルスクリプトに引数が与えられなかったらシェルスクリプト内の
引数が必要なコマンド
の引数にdefault
を指定するんだね!-
はマイナス記号として読むより=
から横棒が一本少なくなって弱くなったと読むと覚えやすいよなるほど!
${変数名:+文字列}
次は「値の代用」だよ!
${変数名:+文字列}
これは 「未定義」か「値が空」でないときに
変数名
の変数が変数名
の値の代わりに文字列
を表示してくれるんだそうでなければ通常どおり変数名
の値(空)を表示するよ値があるのに別の値を使いたいとき…うーん…ちょっと思いつかないや…
こんな例はどうだろう?
export PATH="$PATH${PATH:+:}$HOME/bin"
PATH
変数の値はコマンドを探すパスを:
)」以下を
PATH
変数の値が空になっていた場合にも対応できるよう拡張したものなんだexport PATH="$PATH:$HOME/bin"
なるほど!もし
PATH
の値が空だったらexport PATH="$HOME/bin"
もし PATH
の値が空でなかったらexport PATH="$PATH:$HOME/bin"
そういうふうに展開してくれるんだね!${変数名:?文字列}
最後は「定義のチェック」だよ
${変数名:?文字列}
これは 「未定義」か「値が空」のときに シェルスクリプトを停止して
変数名
の変数が文字列
を標準エラー出力に出力するんだそうでなければ通常通り変数の値を展開するよこれはわかりやすい!値がちゃんと指定されていないと困る場合の確認に使うんだね!
そのとおり!
でも変数を使う所でしか記述できないのは不便だなぁ複数の変数があったら確認があちこちに散らばっちゃうよ
なのでヌルコマンド
:
と一緒に使われるよスクリプト冒頭などで以下のように記述されるんだ: ${X:?Xの値が設定されていません}
: ${Y:?Yの値が設定されていません}
: ${Z:?Zの値が設定されていません}
おおっ!そんなふうに使えるんだ!
今回はパラメータ展開を学んだよ!以下のような記述があるんだ!
記述 | 挙動 |
---|---|
${変数名:=文字列} | 変数名 が未定義か値が空なら 変数名 に 文字列 を代入し表示 |
${変数名:-文字列} | 変数名 が未定義か値が空なら 文字列 を表示、変数名 の値を表示 |
${変数名:+文字列} | 変数名 が未定義か値が空なら 変数名 の値(空)を表示、文字列 を表示 |
${変数名:?文字列} | 変数名 が未定義か値が空ならスクリプトを停止して 文字列 をエラー表示 |
変数をより柔軟に扱える便利な記法だよ!