我想将上周日的日期存储在一个变量中。
#/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
输出:
[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
那么为什么他声称&;date:额外操作数' ago' &;? 如何执行命令的结果并将其设置在变量中?
尝试使用数组来代替变量:
#!/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
输出$ 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