【问题标题】:bash - command in a variable - issue with quotesbash - 变量中的命令 - 引号问题
【发布时间】:2021-10-23 16:23:02
【问题描述】:

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

#/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

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

【问题讨论】:

标签: bash variables


【解决方案1】:

我不确定为什么这不起作用。我认为这与 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

【讨论】:

    【解决方案2】:

    尝试对命令使用数组,而不是变量:

    #!/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 定义的变量发生冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-14
      • 2018-04-01
      • 1970-01-01
      • 2015-04-12
      • 2020-07-06
      • 2021-04-25
      相关资源
      最近更新 更多