繁体   English   中英

bash - 变量中的命令 - 引号问题

[英]bash - command in a variable - issue with quotes

我想将上周日的日期存储在一个变量中。

#/bin/bash

OFFSET=$(date +%u)
COMMAND="date --date='"$((OFFSET))" days ago' +%Y%m%d"
DATEFULL=$($COMMAND)

echo offset $OFFSET
echo command $COMMAND
echo datefull $DATEFULL

Output:

[root@localhost ~]# ./test.sh
date: extra operand ‘ago'’
Try 'date --help' for more information.
offset 1
command date --date='1 days ago' +%Y%m%d
datefull

在命令行中粘贴 $COMMAND 的结果会给出正确的结果:

[root@localhost ~]# date --date='1 days ago' +%Y%m%d
20210822

那么他为什么要声称“日期:额外的操作数'ago''”? 如何执行命令的结果并将其设置在变量中?

尝试使用 arrays 作为命令,而不是变量:

#!/bin/bash

OFFSET=$(date +%u)
COMMAND=(date "--date=$OFFSET days ago" +%Y%m%d)
DATEFULL=$("${COMMAND[@]}")

echo offset $OFFSET
echo command $COMMAND
echo datefull $DATEFULL

此外,所有大写变量名称都可能导致与 bash 定义的变量发生冲突。

我不确定为什么这不起作用。 我认为这与 bash 从命令中解析引号有关。 如果您使用eval ,它会起作用:

#/bin/bash

OFFSET=$(date +%u)
COMMAND="date --date='"$((OFFSET))" days ago' +%Y%m%d"
DATEFULL=$(eval "$COMMAND")

echo offset $OFFSET
echo command $COMMAND
echo datefull $DATEFULL

Output

$ OFFSET=$(date +%u)
$ COMMAND="date --date='"$((OFFSET))" days ago' +%Y%m%d"
$ DATEFULL=$(eval "$COMMAND")
$ echo offset $OFFSET
offset 1
$ echo command $COMMAND
command date --date='1 days ago' +%Y%m%d
$ echo datefull $DATEFULL
datefull 20210822

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM