Bashコマンド置換が機能しない

Bashコマンド置換が機能しない

スクリプトは次のとおりです:

#!/bin/bash

thedate=$(date)


var='Current date is $thedate'

echo $var

出力は「現在の日付は $thedate です」です。日付を表示させたいのですが、何が間違っているのでしょうか? ご助力いただければ幸いです。

答え1

問題は、bashを使用しない限り、 は環境変数を 1 回しか展開しないためeval、コマンド ラインが 2 回解析されることです。

eval echo $var

表示される日付と時刻は、 が参照された時点のものthedateではなく、 が設定された時点のものであることに注意してください$var。 が参照された時点の時刻を表示するには$var、次のものが必要です。

var='Current date is $(date)'
eval echo $var

変数を使用するのではなく、関数を定義する方が良いでしょう:-

cdate() { echo Current date is $(date); }
...
cdate

もちろん、 を使用しない方がまだ良いのですechoが、 letdate自体に余分なテキストを追加します。

cdate() { date +"Current date is %c"; }

これはデフォルトとまったく同じ形式を出力しませんdateが、デフォルトには形式指定子がありません。

答え2

var='Current date is $thedate'

変数は一重引用符内では展開されないため、リテラル テキストを含む文字列が割り当てられます$thedate。変数を展開するには、ここで二重引用符を使用する必要があります。

echo $var

また、ここでは、変数を二重引用符で囲んで、単語分割やパス名拡張の対象にならないようにする必要がありますecho "$var"。つまり、 です。この特定のケースでは、日付にワイルドカード文字が含まれない可能性が高いため、引用符を使用しなくてもほとんどの場合は問題ありません。ただし、引用符を使用しない場合、たとえば日付文字列は のようにFri Dec 7 20:41:21 EET 2018出力されますFri Dec 7 20:41:21 EET 2018。つまり、月名の後の二重スペースが単一のスペースに縮小されます。

答え3

一重引用符の代わりに二重引用符を使用してください。Bash は一重引用符内の変数を展開しません。

関連情報