【问题标题】:Expanding Date Command inside single quotes in linux在linux中的单引号内扩展日期命令
【发布时间】:2020-06-04 05:17:14
【问题描述】:

我是 linux 新手。我想知道为什么 date 命令没有在单引号内展开。

所以如果我给出如下命令

d=$(date +%m%d) 
echo 'A1D$d'

输出为A1D$d

但如果我不带引号给出它的工作......

d=$(date +%m%d) 
    echo A1D$d

输出为A1D0603

谁能帮我解决这个问题

我需要 date 命令在单引号中展开 因为在 aws api 命令中我需要在单引号内使用 date 命令 如下所示

aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query "Contents[?contains(Key, 'A1D$(date +%m%d)')]" --output text | awk '{print $2, $4}' >> "$FILESIZE

【问题讨论】:

  • 最后的命令有什么问题?好像还可以
  • 你的命令没问题。它按预期扩展。能否详细说明您认为它不起作用的原因?
  • 双引号内的单引号不会阻止扩展 echo "foo'$(date)'"

标签: linux bash amazon-web-services shell date


【解决方案1】:

在 bash 中,变量替换 $d 和命令替换 $(date +%m%d) 都将在外部双引号内执行,但不会在外部单引号内执行。

你的例子:

"Contents[?contains(Key, 'A1D$(date +%m%d)')]"

应该已经可以工作了,因为 outer 引号是双引号。内引号不被 shell 解释,而是被当作字符串的一部分。如果您在命令的开头添加echo 可以看到正在生成的内容。

如果您需要使用单引号(例如,为了保护某些其他变量不被替换),然后希望允许一个变量被替换,那么您需要结束单引号。引号不需要围绕整个字符串,只需包含您要保护的某些字符组。例如:

d=hello
echo '$b'$d
echo $d'$c'
echo '$b'$d'$c'

给予:

$bhello
hello$c
$bhello$c

另外,您的命令行末尾有一些问题:

>> "$FILESIZE

不清楚这是什么意思,因为首先这里的引号不匹配,但其次,>> 后面应该是要附加重定向输出的文件的名称,而变量名称 FILESIZE 不'不建议它将包含一个文件名。你应该检查一下这里有什么。

【讨论】:

    【解决方案2】:

    在 bash 中,当你使用 ' 时它不会替换变量,所以你需要使用 " 来完成变量替换。但是当' 进入" 中时,将发生变量替换,因此理想情况下,上面提供的命令行应该可以正常工作。 例如:

    s=test
    $ echo $s
    test
    $ echo "$s"
    test
    $ echo '$s'
    $s
    $ echo "'$s'"
    'test'
    $ echo "Contents[?contains(Key, 'A1D$(date +%m%d)')]"
    Contents[?contains(Key, 'A1D0604')]
    

    要确定您的变量如何在 bash 中被替换,请在调试模式下运行 bash 使用set -x 然后运行命令

    $ set -x
    ~
    $ aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query "Contents[?contains(Key, 'A1D$(date +%m%d)')]" --output text | awk '{print $2, $4}'
    + awk '{print $2, $4}'
    ++ date +%m%d
    + aws s3api list-objects --bucket ui-dl-weather-ecmwf-ltf --prefix daily/ --query 'Contents[?contains(Key, '\''A1D0604'\'')]' --output text
    ~
    ~
    

    所以我相信我们的命令行应该可以在没有任何改变的情况下工作。 (将调试模式恢复为正常set +x

    【讨论】:

      猜你喜欢
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 2015-04-09
      相关资源
      最近更新 更多