在 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

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

答案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

相关内容