のーずいだんぷ

主に自分用メモですが、もしかしたら誰かの役に立つかもしれません

Makefileとシェルスクリプトの変数参照とコマンド実行

はじめに

シェルスクリプトの変数参照とコマンド実行についていつも混乱するので、もっとシンプルにまとめることを目的とする。

シェルスクリプトの変数参照

以下のどれでも参照できる。

//代入
$ 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の世界

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

GNU Make 第3版

GNU Make 第3版

  • 作者:Robert Mecklenburg
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2005/12/01
  • メディア: 大型本