我正在尝试运行aws命令来更新一个文件的缓存控制元数据:
aws s3 cp s3://mybucket/file.js s3://mybucket/file.js --region us-east-1 --acl public-read --metadata-directive REPLACE --cache-control "public, max-age=86400"
但是,我想对多个选定文件运行此命令。因此,我继续使该命令可重用:
bucket="s3://mybucket"
region="us-east-1"
updateflag="--region $region --acl public-read --metadata-directive REPLACE --cache-control \"public, max-age=86400\""
aws s3 cp $bucket/fileA.js $bucket/fileB.js $updateflag
但这不起作用!它给出了Unknown options: max-age=86400"
错误。
我已经尝试过几种用双引号引起来的方法,但是它唯一起作用的时间是这样的:
updateflag="--region $region --acl public-read --metadata-directive REPLACE"
cacheflag="public, max-age=86400"
aws s3 cp $bucket/em.js $bucket/em.js $updateflag --cache-control "$cacheflag"
当我仅在一个变量中获得所有选项时出了什么问题?
感谢您指出重复的问题。
我发现此问题回答了我的问题:Why does shell ignore quotes in arguments passed to it through variables?
我最终做了以下事情:
set_cache_control () {
updateflag=(--region $region --acl public-read --metadata-directive REPLACE --cache-control '"public, max-age=86400"')
aws s3 cp $bucket/$1 $bucket/$1 "${updateflag[@]}"
}
set_cache_control fileA.js
set_cache_control fileB.js
```
答案 0 :(得分:0)
重击将--cache-control \"public, max-age=86400\"
分为--cache-control
"public,
和max-age=86400"
。因此,它不是像您认为的那样解析引号。而是将另一个参数传递给命令,然后aws
cli不知道该如何处理。
由于Bash非常复杂,因此有许多格式化字符串的方法。您可以看看this post处理bash中的嵌套引号。