You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:20:47