我有一长串的命令列表(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
在我的脚本中,我试图传递region
和Values
的参数
我试过这个:
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。)
答案 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库非常易于使用。多种类型的引号问题变得毫无意义。