【问题标题】:How to properly construct a long command line with a mix of single and double quotes?如何正确构造一个混合了单引号和双引号的长命令行?
【发布时间】:2018-03-10 02:16:39
【问题描述】:

我有一长串串在一起的命令(aws cli、jq、cut、sed),这些命令对我有用,我现在正试图在 bash 脚本中运行这些命令。我遇到了单引号和双引号的问题。

如果我手动运行,它将如下:

aws \
  --profile app-prod \
  --region us-east-1 ec2 describe-instances \
  --filter 'Name=tag:ChefRole,Values=foo_bar' \
           'Name=instance-state-name,Values=running' \
| jq -r '.Reservations[].Instances[] | [.InstanceId, .Tags[].Value] | @csv' \
| cut -d ',' -f1 \
| sort > sort.out;sed 's/"//g' sort.out

在我的脚本中,我尝试传入参数 regionValues 我试过这个:

awsCLI(){
    cmd=$(aws --profile app-prod --region ${region} ec2 describe-instances --filter 'Name=tag:ChefRole,Values='${component}'| jq -r '.Reservations[].Instances[] | [.InstanceId, .Tags[].Value] | @csv' | cut -d ',' -f1 | sort > "${_sorted}";sed 's/"//g' "${_sorted}")
}

放置变量 - cmd=$(commands here) 以前在其他脚本中对我有用,但这次不行。

我也尝试过按原样运行:

aws --profile app-prod --region ${region} ec2 describe-instances --filter 'Name=tag:ChefRole,Values='${component}'| jq -r '.Reservations[].Instances[] | [.InstanceId, .Tags[].Value] | @csv' | cut -d ',' -f1 | sort > "${_sorted}";sed 's/"//g' ${_sorted}"

其中任何一个都不适合我。请为此提供最佳实践建议。我应该打破这个吗?你将如何构建这个长命令?

谢谢。

(编者注:第一个代码块被 \ 分割并缩进;A.T.)

【问题讨论】:

    标签: bash shell unix command-line-interface


    【解决方案1】:

    我实际上是想从您的问题中消除永远长的水平滚动条,但后来决定将其转换为答案,也许它实际上解决了您的问题(如果没有,请告诉,将删除):

    awsCLI(){
      cmd=$(aws \
        --profile tealium-prod \
        --region "${region}" ec2 describe-instances \
        --filter 'Name=tag:ChefRole,Values='"${component}" \
      | jq -r '.Reservations[].Instances[] | [.InstanceId, .Tags[].Value] | @csv' \
      | cut -d ',' -f1 \
      | sort > "${_sorted}" \
      ; sed 's/"//g' "${_sorted}" \
      )
    }
    

    我认为主要问题是在Values='"${component}" 周围出现了多余的单个刻度。一般来说,您可以通过并置来连接字符串,您只需要记住"" 会扩展变量,而'' 不会。

    根本原因是不存在缩进。看看行尾的反斜杠是做什么的,它会让你的生活更轻松。

    【讨论】:

    • @noober 我不确定你想对变量 cmd 做什么。也许您想将整个 $(...) 括在额外的双引号 "$(...)" 中。
    • 谢谢!这对我行得通。我在你的回答中使用了你的例子。我不必用双引号括起来。
    • @noober 好。也许还有一点需要注意:以; 开头的缩进样式并不是唯一可能的,而且它并不完全是“经典的”,而是受haskell 启发的。您可能希望选择更接近您使用的语言或组织中使用的语言的另一种缩进样式。不是每个人都会立即认识到以,; 开头的线条的全部美感。但这绝对比将所有内容都塞进一行要好。如果您有更长的Name=tag,Values=blah-sections,请考虑将它们构建为单独的变量。
    【解决方案2】:

    如果你有使用 Python 的能力,boto3 库非常好用。多种引号的问题变得没有实际意义。

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2011-09-03
      • 1970-01-01
      • 2020-07-25
      • 2018-03-19
      • 2013-12-05
      相关资源
      最近更新 更多