bash选择格式



我已经设置了一个脚本,我可以运行以连接到我的服务器,这些服务器包含在 json 字符串变量中。

虽然脚本运行良好,但我发现我不太关心select输出,因为它向我显示了整行。 我想做的只是显示server,但仍然返回ipuser

这可能吗? 如果是这样,如何? 这是我的代码:

#!/bin/bash
_key="/home/MyUser/Documents/Keys/MyKey.pem"
# our server json
_servers='[{"server":"server1","ip":"10.0.0.1","user":"root"},{"server":"server2","ip":"10.0.0.2","user":"ubuntu"},{"server":"server3","ip":"192.168.4.112","user":"ec2-user"}]';

# loop over the items and display the server
echo "- Select a server to connect to: "
select _t in $(echo ${_servers} | jq -c '.[]'); do
# will keep asking until valid value given
[ -n "$_t" ] && break
done
# parse the selected row
_server=$(echo $_t | jq '.server');
_ip=$(echo $_t | jq '.ip');
_user=$(echo $_t | jq '.user');
echo "Connnecting to: ${_server:1:-1}";
sleep 2
#echo ${_ip:1:-1}
#echo ${_user:1:-1}
# make the connection
ssh -i $_key ${_user:1:-1}@${_ip:1:-1}

选择当前显示:

me@MyMachine:~/Desktop# bash test
- Select a server to connect to: 
1) {"server":"server1","ip":"10.0.0.1","user":"root"}
2) {"server":"server2","ip":"10.0.0.2","user":"ubuntu"}
3) {"server":"server3","ip":"192.168.4.112","user":"ec2-user"}
#? 

我希望它显示的是:

me@MyMachine:~/Desktop# bash test
- Select a server to connect to: 
1) server1
2) server2
3) server3
#? 

您需要一个关联数组,用于将服务器名称映射到表示该服务器的 JSON 对象。

declare -A servers
while read -r name data; do
servers[$name]=$data
done < <(jq -rc '.[] | "(.server) (.)"' <<< "$_servers")

然后,您将选择一个服务器名称,并在select语句之后处理关联数据。

select _t in "${!servers[@]}"; do
[ -n "$_t" ] && break
done
read _server _ip _user < <(jq -rc '[.server, .ip, .user][]' <<< "${servers[$_t]}"

或者,处理一次 JSON,并将 IP 地址和用户名存储在单独的数组中。

declare -A ips users
while read -r _server _ip _user; do
ips[$_server]=$_ip
users[$_server]=$_user
done < <(jq -rc '.[] | "(.server) (.ip) (.user)"' <<< "$_servers")
select _server in "${!ips[@]}"; do  # could use "${!users[@]}" as well
[ -n "$_server" ] && break
done
_ip=${ips[$_server]}
_user=${users[$_user]}

最新更新