【发布时间】:2019-04-19 04:08:48
【问题描述】:
我正在尝试运行 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
```
【问题讨论】:
-
参见BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail! 简短摘要:使用函数或数组,而不是普通变量。不要不要使用
eval。 -
更一般地说,当你想重用一个命令时,定义一个函数。
aws_update () { aws s3 cp "$2" "$3" --region "$1" ...; }。像aws_update us-east-1 "s3://mybucket/file1" "s3://mybucket/file2"一样打电话。 -
关于更新:看起来您在缓存控制字符串周围使用了两级引号;不要这样做,因为内部引号将被视为数据的一部分。另外,我建议使用函数或数组,而不是两者。一旦你使用了一个函数,数组就是一个无用的复杂化。
标签: bash