繁体   English   中英

如何将包含 ` ` 的命令分配给 bash shell 脚本中的变量?

[英]How to assign a command contains ` ` to a variable in bash shell script?

我想编写一个 bash 脚本,用于在 aws 中从目标组自动注册和注销目标。

脚本是这样的:

#!/bin/bash
target_group_name=$1
instance_Id=$2
target_group_arn="$(aws elbv2 describe-target-groups --query 'TargetGroups[?contains(TargetGroupName, `$1`)].TargetGroupArn' --output text)"
echo -n "Enter the option you want to do (enter 1 for register and enter 2 for deregister): "
read OPTION
case $OPTION in 
  1)
    if register_output=$(aws elbv2 register-targets --target-group-arn '$target_group_arn' --targets Id="$2"); 
    then
      echo "Registering instance into target group. Please wait for 5 minutes registration progress finished"
    else
      echo "!!!! ERROR !!!!"
    fi
    ;;
  2) 
    if deregister_output=$(aws elbv2 deregister-targets --target-group-arn '$target_group_arn' --targets Id="$2"); 
    then
      echo "Deregistering instance into target group. Please wait for 5 minutes registration progress finished"
    else
      echo "!!!! ERROR !!!!"
   fi
    ;;
  *)
    echo "unknown option"
    ;;
esac

但是,当我运行脚本时,没有找到 arn。

我尝试打印出$1 (S1 在左操作数符号内)。 但是,似乎bash脚本不理解,它什么也没打印出来。

你能帮我弄清楚我的脚本有什么问题吗? 或者我如何重现我的查询以获取目标组的 arn 以便我可以将它传递给我的命令?

非常感谢!

您的目标组 ARN 解析器如下所示:

aws elbv2 describe-target-groups \
  --query 'TargetGroups[?contains(TargetGroupName, `$1`)].TargetGroupArn' \
  --output text

我不确定您是否在$1变量周围使用了反引号,但是:

  1. 反引号在shell中用于执行反引号内的命令并解析为命令的输出,这显然不是您想要的。
  2. AWS 查询可以很好地使用双引号 ( " )。我从未见过这样使用反引号。
  3. 无论如何 - 因为整个查询是单引号,所以您的$1变量不会解析 - AWS CLI 将完全按照所写的方式获取查询,甚至不会执行反引号,如果您在开始时使用echo运行该命令,您会看到.

你可能想写这个:

aws elbv2 describe-target-groups \
  --query "TargetGroups[?contains(TargetGroupName, \"$1\")].TargetGroupArn" \
  --output text

因为我刚刚找到了我的问题的答案,所以我会在这里为感兴趣的人发布我的答案并关闭我的帖子。

非常感谢你们帮助我! :D

#!/bin/bash
profile=$1
target_group_name=$1
instance_id=$2

target_group_arn="$(aws elbv2 describe-target-groups --query 'TargetGroups[].[TargetGroupArn]' --names "$2" --profile "$1" --output text)"

echo -n "Enter the option you want to do (enter 1 for register and enter 2 for deregister): "
read OPTION
case $OPTION in 
  1)
    if register_output=$(aws elbv2 register-targets --target-group-arn "$target_group_arn" --targets Id="$2"); 
    then
      echo "Registering instance into target group. Please wait for 5 minutes registration progress finished"
    else
      echo "!!!! ERROR !!!!"
    fi
    ;;
  2) 
    if deregister_output=$(aws elbv2 deregister-targets --target-group-arn "$target_group_arn" --targets Id="$2"); 
    then
      echo "Deregistering instance into target group. Please wait for 5 minutes registration progress finished"
    else
      echo "!!!! ERROR !!!!"
   fi
    ;;
  *)
    echo "unknown option"
    ;;
esac

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM