在 bash 中,如何调用变量并在其值周围加上引号作为命令的一部分,而不会导致变量名称成为字符串文字?

eva*_*vid 6 bash shell-script date quoting

所以我想给时间增加 10 秒。执行此操作的命令来自此处

为了显示:

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

我对这段代码的问题是,如果我回显$CALL变量,它会给出:

date -d 12:51:19 today + 10 seconds +%H:%M:%S
Run Code Online (Sandbox Code Playgroud)

此字符串的正确版本如下所示:

date -d "12:48:03 today + 10 seconds" +'%H:%M:%S'
Run Code Online (Sandbox Code Playgroud)

但是如果我将变量名用引号括起来,就像这样:

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

...它被解释为字符串文字,如果你回显它,它会给出:

date -d $ENDTIME +%H:%M:%S
Run Code Online (Sandbox Code Playgroud)

所以我需要做的是调用变量,使其值交换到函数中并用双引号(“)包装,但避免将变量的名称作为文字字符串读取。我对此非常困惑,我想念Python!

meu*_*euh 9

为了完整起见,您不需要所有那些 (") 或 final $(echo ...)。这是您的作业的简化版本,可以产生相同的效果:

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

请注意在执行 var=$(...) 时如何不需要引用,但通常使用 var="many words":

a=$(echo 'a    b'); echo "$a" # result: a    b
Run Code Online (Sandbox Code Playgroud)

里面 (") a (') 没有特殊意义,反之亦然,例如:

a="that's nice"; echo "$a" # result: that's nice
a='that "is nice'; echo "$a" # result: that "is nice
Run Code Online (Sandbox Code Playgroud)