web-dev-qa-db-ja.com

bashで、変数名を文字列リテラルにせずに、変数を呼び出してコマンドの一部としてその値を引用符で囲む方法は?

それで、時間に10秒を追加したいと思います。そのためのコマンドは here からのものです。

説明する:

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

だから私がする必要があるのは、その値が関数に入れ替えられて二重引用符( ")でラップされるように変数を呼び出すことですが、変数の名前がリテラル文字列として読み取られることは避けてください。これは非常に混乱しています、Pythonが恋しい!

4
evamvid

完全を期すために、これらすべて( ")も最後の$(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( ')には特別な意味はありません。逆も同様です。

a="that's Nice"; echo "$a" # result: that's Nice
a='that "is Nice'; echo "$a" # result: that "is Nice
8
meuh

呼び出しステートメントは次のように編集できます。

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

\を使用して、文字をエスケープできます"および'。今echo $CALLは次のように出力されます:

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

次のように、一重引用符insideを二重引用符で囲んだ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
0
user86969