【问题标题】:bash command syntax with options with double quotes in variables [duplicate]bash命令语法,变量中带有双引号的选项[重复]
【发布时间】: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


【解决方案1】:

Bash 将 --cache-control \"public, max-age=86400\" 分为 --cache-control "public,max-age=86400"。所以它不会像你想象的那样解析引号。相反,它将另一个参数传递给命令,然后aws cli 不知道如何处理。

由于 Bash 很复杂,而且有很多方法可以格式化字符串。你可以看看this post在bash中处理嵌套引号。

【讨论】:

    猜你喜欢
    • 2023-01-08
    • 2016-01-22
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多