シェルスクリプトでevalに助けられた話


一応、個人でプロダクトを出してみようとちょろちょろやっているのですが
シェルスクリプトでちょっとしたtoolを作っていた時にevalに助けられた話です。

※そもそもevalってなんだろという点に関しては多くの方が書いていたり、ググればすぐ出てくるので割愛

1.連想配列的な使い方

bashでも4系であれば連想配列が使えるようなのですが、残念ながら事情があり3系の状態で
連想配列を使いたくなる状況が出てきました。
結論的には連想配列とは違うのですが、こんな感じで出来たので、まぁ良しとします。

associative_array.sh
#!/bin/bash
ruby_path="/Users/overq/ruby"
python_path="/Users/overq/python"

lang=$1
eval echo \$${lang}_path
./associative_array.sh ruby
/Users/overq/ruby

2.パイプが入ったコマンドの実行

普通にこんな感じでは実行できると思いますが

pipe1.sh
num=`ls -l | wc -l`

こんな感じだと

pipe2.sh
command="ls -l | wc -l"
num=`$command`
ls: -l: No such file or directory
ls: wc: No such file or directory
ls: |: No such file or directory

となってしまい、lsのオプション扱いになってしまいます。
evalを使うと・・・いけました!
(結果を変数に入れて後の処理に使いたかったのでfunctionに切り出した形を取っています)

pipe3.sh
function file_num() {
  command="ls -l | wc -l"
  eval $command
}

num=`file_num`
echo $num

結構適当な例になってしまったのと、このあたり全く詳しくないのでツッコミどころはあると思います。
もっといい方法とかご意見いただけるとありがたいです!