Lから始まるLinux

3章19話
envコマンド
3章20話 パラメータ展開(基本)
もくじ
3章21話
パラメータ展開(拡張)
パラメータ展開(基本)
若木 しげる
今回は変数の高度な使い方 「パラメータ展開 (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の値が設定されていません}
若木 みどり(驚き)
おおっ!そんなふうに使えるんだ!
まとめ
若木 みどり
今回はパラメータ展開を学んだよ!以下のような記述があるんだ!
記述挙動
${変数名:=文字列}変数名 が未定義か値が空なら 変数名文字列 を代入し表示
${変数名:-文字列}変数名 が未定義か値が空なら 文字列 を表示、そうでないなら 変数名 の値を表示
${変数名:+文字列}変数名 が未定義か値が空なら 変数名 の値(空)を表示、そうでないなら 文字列 を表示
${変数名:?文字列}変数名 が未定義か値が空ならスクリプトを停止して 文字列 をエラー表示
若木 しげる
変数をより柔軟に扱える便利な記法だよ!