はじめに
シェルスクリプトの変数参照とコマンド実行についていつも混乱するので、もっとシンプルにまとめることを目的とする。
シェルスクリプトの変数参照
以下のどれでも参照できる。
//代入 $ var='a b c' $ echo $var a b c $ echo "$var" a b c $ echo "${var}"
echo
を使用せずに参照すると、参照した値をコマンドとして実行したことになる。
$ $var -bash: a: command not found $ "$var" -bash: a b c: command not found $ '$var' -bash: $var: command not found $ "${var}" -bash: a b c: command not found $ ${var} -bash: a: command not found
実は$""
と$
では変数の解釈が違うことに注意したい。
なお'$'
では、変数参照としてそもそも解釈されないので注意が必要
また上記からわかる結果として、$
と${}
では一切の差がないことがわかる。
次で確認するが$()
は使用できないので注意が必要。
シェルスクリプトでコマンド実行結果を変数に保存する
以下の2通りで実行できる。
$ com_var=`ls` $ echo $com_var Applications Library Preboot System Users Volumes bin cores dev etc home opt private sbin tmp usr var $ com_var=$(ls) $ echo $com_var Applications Library Preboot System Users Volumes bin cores dev etc home opt private sbin tmp usr var
バッククオートとの違いは入れ子構造にできる点である。
$ res=$(echo $com_var | sed 's/home/replace/') $ echo $res Applications Library Preboot System Users Volumes bin cores dev etc replace opt private sbin tmp usr var
Makefileでの表現
Makeのややこしい点として、変数参照に
$()が使用される。(シェルでは無理だった)
ということがある。
どういうことか?つまりコマンド実行結果を変数へ格納するには$$()と記載する必要がある
ということだ。
例を見てみよう。
だめな場合のMakefile
var=$(echo hello) res=${var} test: @echo $(res)
//実行結果 make test //変数echo helloには値がないからなにも表示されない
コマンドとして解釈される(okな)場合のMakefile
var=$$(echo hello) res=${var} test: @echo $(res)
//実行結果
$ make test
hello
コマンドを変数へ格納して変数をコマンドをして実行するには?
ここでこれまでのことがごちゃごちゃになって、つい$$()
でやってしまいそうなのだが、これは違う。
変数参照した結果をコマンドとして利用する、つまり変数参照の書き方をする必要がある。(冒頭のシェルスクリプトで変数単体を参照したときにコマンドとして実行されてしまったのと同じこと)
Makefile
com=ls -a ex: $(com)
入れ子になっていても実行できるのか?
また混乱しそうなケースとして、先程コマンドを変数に代入したが、そのコマンド自体で変数を参照、もしくはコマンドの実行結果がある場合はどうなるのだろうか?
Makefile
res=$$(ls -a) // grep_wordというファイルを用意 com=echo $(res) | grep $$(cat grep_word) ex: $(com)
実行結果
$ make ex echo $(ls -a) | grep $(cat grep_word) . .. Makefile grep_word host_name
無事に出力できた。
これらをいきなり学ぶと混乱してしまうが、基本をちゃんと覚えている特段難しいことはない(当たり前だが…)
おわりに
やっぱりネットでの付け焼き刃の知識は混同してよくわからなくなるので、下記の書籍で一旦ざっと流し勉強したい。
シェルスクリプトの本はかなり良さそうだった。(積ん読中)まずはこれから頑張る。
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
- 作者:ブルース・ブリン,Bruce Blinn
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2003/02
- メディア: 単行本
- 作者:Robert Mecklenburg
- 出版社/メーカー: オライリージャパン
- 発売日: 2005/12/01
- メディア: 大型本