Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用单引号和双引号正确地构造一个长命令行?_Bash_Shell_Unix_Command Line Interface - Fatal编程技术网

Bash 如何使用单引号和双引号正确地构造一个长命令行?

Bash 如何使用单引号和双引号正确地构造一个长命令行?,bash,shell,unix,command-line-interface,Bash,Shell,Unix,Command Line Interface,我有一长串的命令(awscli、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,Va

我有一长串的命令(awscli、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
在我的脚本中,我试图传入参数
区域
我试过这个:

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=$(此处的命令)
放在其他脚本中对我很有用,但这次不行

我还试着按原样跑步:

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.)

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

我认为主要的问题是在
value='“${component}”
周围有多余的单勾号。通常,您可以通过并置连接字符串,您需要记住的是,
展开变量,而
不展开变量


根本原因是不存在压痕。查看一行末尾的反斜杠的作用,它将使您的生活更加轻松。

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

我认为主要的问题是在
value='“${component}”
周围有多余的单勾号。通常,您可以通过并置连接字符串,您需要记住的是,
展开变量,而
不展开变量


根本原因是不存在压痕。查看行末的反斜杠的作用,它将使您的生活更加轻松。

如果您能够使用Python,boto3库非常容易使用。多类型引号的问题变得毫无意义。

如果您能够使用Python,boto3库非常容易使用。带有多种引号的问题变得毫无意义。

@noober我不确定您想用变量
cmd
做什么。也许您想将整个
$(…)
括在额外的双引号中
“$(…)”
。谢谢!这对我很有用。我在你的回答中用了你的例子。我不必用双引号括起来。@noober很好。也许还有一句话:带有
的缩进样式并不是唯一可能的,也不完全是“经典”,而是哈斯克尔的灵感。您可能希望选择另一种更接近您使用的语言或组织中使用的语言的缩进样式。不是每个人都能立即意识到以
开头的线条的全部美。但这肯定比把所有东西塞进一行要好。如果您有更长的代码> name=tag,值=BLAH < /代码> -节,请考虑将它们构造为单独的VARS。@ NoOBER,但我不确定您想用变量<代码> CMD< /Cube >做什么。也许您想将整个
$(…)
括在额外的双引号中
“$(…)”
。谢谢!这对我很有用。我在你的回答中用了你的例子。我不必用双引号括起来。@noober很好。也许还有一句话:带有
的缩进样式并不是唯一可能的,也不完全是“经典”,而是哈斯克尔的灵感。您可能希望选择另一种更接近您使用的语言或组织中使用的语言的缩进样式。不是每个人都能立即意识到以
开头的线条的全部美。但这肯定比把所有东西塞进一行要好。如果您有更长的代码> name=tag,值=BLAH  -节,请考虑将它们构造为单独的VAR。
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}" \
  )
}