正しいアプローチは、Bash スクリプト内で独自の関数を定義することです。
function my_date {
date "+%y-%m-%d %H:%M:%S"
}
my_date
を使用できるようになりました あたかも外部プログラムであるかのように。
例:
echo "It is now $(my_date)."
または単に:
my_date
あなたのアプローチがうまくいかないのはなぜですか?
最初の問題は、あなたの割り当てが壊れていることです。
DATE_COMMAND="date "+%y-%m-%d %H:%M:%S""
これは、文字列 date +%y-%m-%d
の代入として解析されます 変数 DATE_COMMAND
に .空白の後、シェルは意図しない方法で残りの記号を解釈し始めます。
これは、見積もりを変更することで部分的に修正できます。
DATE_COMMAND="date '+%y-%m-%d %H:%M:%S'"
ただし、これで問題が解決するわけではありません。
echo $($DATE_COMMAND)
引数が正しく展開されません。 date
プログラムには引数 '+%y-%m-%d
が表示されます および %H:%M:%S'
(引用符付き) 単一の文字列の代わりに。これは eval
を使用することで解決できます のように
DATE_COMMAND="date '+%y-%m-%d %H:%M:%S'"
echo $(eval $DATE_COMMAND)
変数 DATE_COMMAND
最初に文字列 date '+%y-%m-%d %H:%M:%S'
に展開されます それは eval
です あたかもそのように書かれているかのように使用され、 date
が呼び出されます
問題を説明するためにこれを示しているだけであることに注意してください。 eval
ここでは良い解決策ではありません。代わりに関数を使用してください。
PS すべて大文字の識別子文字列は、環境変数と競合することが多く、シェルにとって魔法のような意味を持つことさえあるため、避けることをお勧めします。
スペースからの脱出はうまくいきます。
echo `date +%d.%m.%Y\ %R.%S.%3N`