使用bash,我需要在运行一系列命令之前回显它们。以这个例子为例,它既简单又好用。请注意,所有代码示例都已通过ShellCheck运行,ShellCheck报告未检测到任何问题。
OUTPUTS_CMD=(aws cloudformation describe-stacks --stack-name "#{StackName}" --query 'Stacks[0].Outputs')
echo "${OUTPUTS_CMD[*]}"
OUTPUTS=$("${OUTPUTS_CMD[@]}")
然而,其他命令需要输入,虽然我可以成功地回显这些命令,但实际上我无法让它们运行。
GET_FUNCTION_NAME_CMD=(jq --raw-output "'map(select(.OutputKey == "ProxyFunctionName")) | .[].OutputValue'")
echo "${GET_FUNCTION_NAME_CMD[*]} <<< "$OUTPUTS""
FUNCTION_NAME=$("${GET_FUNCTION_NAME_CMD[@]}" <<< "$OUTPUTS")
上面的示例输出以下内容,如果复制并粘贴,则返回正确的值。
jq--原始输出'映射(选择(.OutputKey=="ProxyFunctionName"(|。[].OutputValue'<lt<quot$OUTPUTS";
但是,命令"${GET_FUNCTION_NAME_CMD[@]}" <<< "$OUTPUTS"
返回一个错误。如果我echo "$OUTPUTS"
并将其管道传输到保存在变量中的命令中,而不是使用herestring,也会发生同样的错误,所以我认为错误在于该命令在数组中的定义方式。
$ FUNCTION_NAME=$("${GET_FUNCTION_NAME_CMD[@]}" <<< "$OUTPUTS")
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
'map(select(.OutputKey == "ProxyFunctionName")) | .[].OutputValue'
jq: 1 compile error
如何使变量中的命令与herestring一起运行?
$OUTPUTS
的示例值
[
{
"OutputKey": "ProxyFunctionName",
"OutputValue": "MyFunctionName",
"Description": "Proxy Lambda Function ARN"
},
{
"OutputKey": "ProxyFunctionUrl",
"OutputValue": "https://my.function.url",
"Description": "Proxy Lambda Function invocation URL"
}
]
OUTPUTS=$(cat <<JSON
[
{
"OutputKey": "ProxyFunctionName",
"OutputValue": "MyFunctionName",
"Description": "Proxy Lambda Function ARN"
},
{
"OutputKey": "ProxyFunctionUrl",
"OutputValue": "https://my.function.url",
"Description": "Proxy Lambda Function invocation URL"
}
]
JSON
)
OutputKey=ProxyFunctionName
GET_FUNCTION_NAME_CMD="jq -r '.[] | objects | select(.OutputKey == "$OutputKey") | .OutputValue'"
echo "$GET_FUNCTION_NAME_CMD <<<"$OUTPUTS""
# jq -r '.[] | objects | select(.OutputKey == "ProxyFunctionName") | .OutputValue' <<<"$OUTPUTS"
FUNCTION_NAME=$(eval $GET_FUNCTION_NAME_CMD <<<"$OUTPUTS")
echo $FUNCTION_NAME
# MyFunctionName