设置命令的bash脚本变量导致找不到命令错误

设置命令的bash脚本变量导致找不到命令错误,bash,amazon-web-services,Bash,Amazon Web Services,我正在写一个脚本,搜索一堆AWS帐户的IP地址。我正在根据用户的输入设置jq命令 我得到的错误是: ./aws_utils.sh: line 1434: jq -r '.Reservations[].Instances[].PrivateIpAddress': command not found 我试图用以下代码设置设置jq命令的变量: echo "Find IP Address in AWS" echo "Search for Public or Private IP Addresses?

我正在写一个脚本,搜索一堆AWS帐户的IP地址。我正在根据用户的输入设置jq命令

我得到的错误是:

./aws_utils.sh: line 1434: jq -r '.Reservations[].Instances[].PrivateIpAddress': command not found
我试图用以下代码设置设置jq命令的变量:

echo "Find IP Address in AWS"

echo "Search for Public or Private IP Addresses?"
echo "Enter public/private:"
read -r search_scope

 if [[ "$search_scope" = "public" ]]; then
   set_search="jq -r '.Reservations[].Instances[].PublicIpAddress'"
 elif [[ "$search_scope" = "private" ]]; then
   set_search="jq -r '.Reservations[].Instances[].PrivateIpAddress'"
else
  echo "Invalid Input"
fi
脚本运行时,这一行代码是发生错误时的代码:

search_result=$(aws ec2 describe-instances --profile="$aws_env" | "$set_search" | /bin/grep -v null | /bin/grep \"$ip_address\")
如果在命令行上运行相同的命令,则不会出现错误:

aws ec2 describe-instances --profile=nonprod | jq -r '.Reservations[].Instances[].PrivateIpAddress' | /bin/grep -v null | /bin/grep 10.48.167.228
10.48.167.228

为什么jq命令会在脚本中生成“未找到命令”错误?

如果要存储代码,请将其存储在函数中。您可以有条件地定义它们,就像定义其他任何内容一样:

if [[ "$search_scope" = "public" ]]; then
  search_json() { jq -r '.Reservations[].Instances[].PublicIpAddress' "$@"; }
elif [[ "$search_scope" = "private" ]]; then
  search_json() { jq -r '.Reservations[].Instances[].PrivateIpAddress' "$@"; }
else
  echo "Invalid Input" >&2; exit 1;
fi
……及以后:

ip_address=$(curl http://example.com/json | search_json)

看见代码永远不应该存储在变量中……尽管在这种情况下,您可以通过jq查询分配一个字符串,而不是通过整个命令分配一个字符串
query='.Reservations[].Instances[].PublicIpAddress'
,然后调用
jq-r“$query”
,避开了手头的问题。您甚至可能不需要
jq
grep
aws
可以使用(通过
--query
选项)为您进行大量筛选。类似于
aws ec2描述实例--query.Reservations[*].instances[?PublicIpAddress==`10.48.167.228`]
。我尝试将jq命令放入它们自己的函数中,并仅使用传递给jq命令的查询设置变量。两个都有用!非常感谢。