如何正确构造一个混合了单引号和双引号的长命令行?

时间:2018-03-10 02:16:40

标签: bash shell unix command-line-interface

我有一长串的命令列表(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。)

2 个答案:

答案 0 :(得分:3)

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

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}"周围多余的单一嘀嗒声。通常,您可以通过并置来连接字符串,您必须记住的是""扩展变量,而''则不会。

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

答案 1 :(得分:1)

如果您有能力使用Python,那么boto3库非常易于使用。多种类型的引号问题变得毫无意义。