Bashで変数名を文字列リテラルにするのではなく、コマンドの一部として値の周りに引用符を使用して変数を呼び出すにはどうすればよいですか?

Bashで変数名を文字列リテラルにするのではなく、コマンドの一部として値の周りに引用符を使用して変数を呼び出すにはどうすればよいですか?

だから時間に10秒を追加したいと思います。これを行うためのコマンドは、以下で提供されます。ここ

表示するには:

STARTIME="$(date +"%T")"
ENDTIME="$STARTIME today + 10 seconds"
CALL="$(echo date -d $ENDTIME +'%H:%M:%S')"

このコードの問題は、$CALL変数をエコーすると次のような結果が出ることです。

date -d 12:51:19 today + 10 seconds +%H:%M:%S

この文字列の正しいバージョンは次のとおりです。

date -d "12:48:03 today + 10 seconds" +'%H:%M:%S'

ただし、変数名を次のように引用符で囲むと、次のようになります。

STARTIME="$(date +"%T")"
ENDTIME="$STARTIME today + 10 seconds"
CALL="$(echo date -d '$ENDTIME' +'%H:%M:%S')"

...文字列リテラルとして解釈され、エコーすると次の結果が表示されます。

date -d $ENDTIME +%H:%M:%S

だから私がしなければならないのは、変数を呼び出してその値を関数に置き換えて二重引用符( ")で囲むようにすることです。ただし、変数名をリテラル文字列として読み取らないでください。これは非常に混乱しています。

答え1

完全性のためにすべての項目( ")または最後の項目は必要ありません$(echo ...)。以下は同じ効果を生み出す単純化された作業バージョンです。

STARTIME=$(date +"%T")
ENDTIME="$STARTIME today + 10 seconds"
CALL="date -d '$ENDTIME' +'%H:%M:%S'"

var=$(...) を実行する場合は引用は必要ありませんが、通常 var="many Words" を使用する場合は引用が必要です。

a=$(echo 'a    b'); echo "$a" # result: a    b

(')内部('')には特別な意味がなく、その逆も同様です.例えば、次のようになります.

a="that's nice"; echo "$a" # result: that's nice
a='that "is nice'; echo "$a" # result: that "is nice

答え2

呼び出しステートメントを編集して、次のことができます。

CALL="$(echo date -d \"$ENDTIME\" +\'%H:%M:%S\')"

\文字"やエスケープに使用できます'。これで出力は次echo $CALLのようになります。

date -d "22:46:37 today + 10 seconds" +'%H:%M:%S'

答え3

一重引用符を追加~へ二重引用符で囲まれたENDTIME変数は次のとおりです。

ENDTIME="'$STARTIME today + 10 seconds'"
CALL="$(echo date -d "$ENDTIME" +'%H:%M:%S')"

それを与えなければならない

date -d '19:35:28 today + 10 seconds' +%H:%M:%S

関連情報