Lから始まるLinux

2章42話
算術式展開
2章43話 evalコマンド
もくじ
2章44話
差分
eval コマンド
若木 みどり
お兄ちゃん! ブレース展開を 試しているんだけど どうも上手く行かないんだ!
若木 みどり
試したコマンドはこれだよ!
END=4
echo {1..$END}
若木 みどり
ブレース展開されて以下のようになると思ったんだけど…
1 2 3 4
若木 みどり
でも実際はこうだったんだ…
{1..4}
若木 みどり
この原因…わかるかな?
若木 しげる
これは初心者が手こずる問題の一つだね!今回はこの挙動の説明と解決方法を伝えるよ
多段展開の挙動
若木 しげる
みどりの記述が期待どおりに動くには展開が2段階必要なんだ
  1. END 変数が展開されて数値 4 になる
  2. {1..4} がブレース展開される
若木 みどり
言われてみると確かにそうだよね
若木 しげる
このように展開が何段階も重なっている場合シェルは最初の展開しか行ってくれないんだ
若木 みどり(驚き)
つまり END 変数は展開されるけどブレース展開は行われないということ?
若木 しげる
そういうことなんだ実際に結果は{1..4} だったでしょ?
多段展開の解釈
若木 みどり
でも、色々な記述を学んでそれらを組み合わせられるようになるとこういった場面は結構あると思うんだどうにかならないかな?
若木 しげる
eval は多段の展開を評価するよ「evaluate(評価する)」の略なんだ
eval コマンド
若木 しげる
このように eval を実行すると展開が無くなるまで展開を繰り返してから指定のコマンドを実行してくれるんだ
若木 みどり
へぇ!これで問題を解決できるかな?
若木 しげる
みどりの例でeval を使ってみよう!
END=4
eval echo {1..$END}
若木 みどり
echo の前にeval を追加しただけだね!ちゃんと動いてくれるかな?
1 2 3 4
若木 みどり(驚き)
おお!こうやって解決するんだ!
まとめ
若木 みどり
今回は記述の展開が多段になっているとシェルは最初の展開しかしてくれないことと多段の展開をしてくれる eval を覚えたよ!
若木 しげる
定義どおりの記述をしているはずなのに期待どおりの動作をしてくれない場合はこの挙動が原因の場合がほとんどなんだもしそうなら eval で解決できるよ!