9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-09-22

一応、個人でプロダクトを出してみようとちょろちょろやっているのですが
シェルスクリプトでちょっとした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

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

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?