我是一个新的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
在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
并不表明它将包含一个文件名。 你应该检查一下你这里有什么。
在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
)