bashでは、定義した変数はコマンドライン上でも二重引用符の文字列内でも展開されます。
$ format='+%Y-%m-%d'; date $format 2012-01-17 $ whom='Hanako'; echo "Hello, $whom" Hello, Hanako
入れ子もできます。
$ whom='Hanako'; greeting="Hello, $whom"; echo "Today : $greeting" Today : Hello, Hanako
コマンドの実行結果をコマンドライン上で利用したり変数値にセットするにはバッククォートを使います。
$ echo `date +%Y-%m-%d` 2012-01-17 $ today=`date +%Y-%m-%d`; echo "Today $today: Hello, Hanako" Today 2012-01-17: Hello, Hanako
変数を経由しなくても、バッククォート構文と文字列を連結して使えます。
$ echo "Today: "`date +%Y-%m-%d`": Hello, Hanako" Today: 2012-01-17: Hello, Hanako
しかしこれは、みにくいですね。次のように、$( ) を使って書くとスッキリします。
$ echo "Today: $(date +%Y-%m-%d): Hello, Hanako" Today: 2012-01-17: Hello, Hanako
$( ) の括弧のなかにコマンドラインを書けるのです。外側で定義された変数を括弧内で使うこともできます。
$ format='+%Y-%m-%d'; echo "Today: $(date $format): Hello, Hanako" Today: 2012-01-17: Hello, Hanako
バッククォートの代替としても使えます。
$ today=$(date +%Y-%m-%d); echo "Today $today: Hello, Hanako" Today: 2012-01-17: Hello, Hanako
バッククォートよりずっとスマートに思えます*1。
*1:でも、習慣から僕はバッククォートを使ってしまって、$()に移行できません(苦笑)。