在linux中扩展单引号内的Date命令。

问题描述 投票:1回答:1

我是一个新的linux用户,我想知道为什么date命令不能在单引号内展开。我想知道为什么日期命令不能在单引号内展开。

所以,如果我给命令像下面

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

产出为 A1D$d

但如果我不加引号,它就会工作......

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

输出是 A1D0603

谁能帮我一下?

我需要 日期命令中展开单引号 因为......在 aws api 我需要使用的命令 单引号内的日期命令 如下

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
linux bash amazon-web-services shell date
1个回答
1
投票

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

你的例子。

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

应该已经可以了,因为 外围 引号是双引号。 内引号不被shell解释,而是作为字符串的一部分来处理。 你可以看到,如果你在字符串中添加一个 echo 到命令的开头来查看正在生成的内容。

如果你需要使用单引号(例如,为了保护其他变量不被替换),然后又想让一个变量被替换,那么你需要结束单引号。 引号不需要围绕整个字符串,只需要保护其中的一些字符组。 例如

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

gives:

$bhello
hello$c
$bhello$c

另外,在你的命令行末尾有一些问题。

>> "$FILESIZE

不知道这句话的意思是什么 因为首先这里的引号是不匹配的 其次,在你的命令行末尾处 >> 应该是要追加重定向输出的文件名,变量名为 FILESIZE 并不表明它将包含一个文件名。 你应该检查一下你这里有什么。


1
投票

在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)

© www.soinside.com 2019 - 2024. All rights reserved.