bash命令语法,变量中带有双引号的选项

时间:2018-11-16 00:49:35

标签: bash

我正在尝试运行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

```

1 个答案:

答案 0 :(得分:0)

重击将--cache-control \"public, max-age=86400\"分为--cache-control "public,max-age=86400"。因此,它不是像您认为的那样解析引号。而是将另一个参数传递给命令,然后aws cli不知道该如何处理。

由于Bash非常复杂,因此有许多格式化字符串的方法。您可以看看this post处理bash中的嵌套引号。