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