如何让Bash Select将EC2实例名称与IP设为同一选项?
解决Bash Select中EC2实例名称与IP拆分的问题
要把每个EC2实例的名称和私有IP合并为Select的单个选项,核心是先将每个实例的两个字段合并为单行,再将这些行存入数组,避免Bash自动按空格拆分字段。以下是具体实现:
修正后的脚本示例
# 1. 获取符合条件的EC2实例,将名称与IP合并为单行 mapfile -t instances < <( aws ec2 describe-instances \ --filters "Name=instance-state-name,Values=running" "Name=tag:Stage,Values=live" \ --query 'Reservations[*].Instances[*].[Tags[?Key==`Name`].Value|[0], PrivateIpAddress]' \ --output text | awk '{printf "%s (%s)\n", $1, $2}' ) # 2. 用Select展示合并后的实例选项 PS3="请选择要连接的EC2实例: " select instance in "${instances[@]}"; do if [[ -n $instance ]]; then # 从选项中提取私有IP(移除括号) target_ip=$(echo "$instance" | sed -E 's/.*\(([0-9.]+)\)/\1/') echo "正在通过SSH连接到 $instance..." ssh "$target_ip" break else echo "无效选项,请重新输入" fi done
关键说明
mapfile -t:读取命令输出的每一行到数组instances,保留包含空格的实例名称,避免被Bash按空格拆分为多个数组元素。- AWS CLI格式化:通过
--query精准提取实例名称和私有IP,--output text输出为空格分隔的字段,再用awk合并为实例名称 (私有IP)的单行格式。 - IP提取:用
sed或awk从合并后的选项中提取IP,用于后续SSH连接。
内容的提问来源于stack exchange,提问作者user1819769
相关产品推荐
相关产品推荐

