如何从bq shell脚本中将正确的键和值从jq拉入数组

时间:2019-10-28 19:44:43

标签: json bash shell dialog jq

我有一个json文件,其格式如下:

{
  "ServerName1": {
    "localip": "192.168.1.1",
    "hostname": "server1"
  },
  "ServerName2": {
    "localip": "192.168.1.2",
    "hostname": "server2"
  },
  "ServerName3": {
    "localip": "192.168.1.3",
    "hostname": "server3"
  }
}

我正在尝试编写一个使用Dialog创建一个菜单来运行ssh连接命令的shell脚本。我正在用jq进行解析,但不能超过第一个对象级别。我们有很多服务器,这将使连接它们变得更加容易。我的Dialog语句可以很好地处理静态数据,但是我们尝试使用JSON文件填充其余数据。所以我正在自杀,试图弄清楚如何仅将localip和主机名放入数组以循环到Dialog命令中,或者将有效地执行相同操作的东西吐出,到目前为止,我已经知道它可以吐出< / p>

Servername1 = {"localip":"192.168.1.1","hostname":"server1"}

每行上的

。我是一个shell脚本新手,但是现在这很混乱。

这是到目前为止我一直在使用的jq命令:

jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" config.json

这是适用于静态数据的Dialog命令:

callssh(){
  clear
  ssh $1@$2
}

## Display Menu ##
dialog --clear --title "SSH Relayer"\
    --menu "Please choose which server \n\
    with which you would like to connect" 15 50 4 \ 
    "Server 1" "192.168.1.1"\
    "Server 2" "192.168.1.2"\
    "Server 3" "192.168.1.3"\
    Exit "Exit to shell" 2>"${INPUT}"

menuitem=$(<"${INPUT}")

case $menuitem in
    "Server 1") callssh $sshuser 192.168.1.1;;
    "Server 2") callssh $sshuser 192.168.1.2;;
    "Server 3") callssh $sshuser 192.168.1.3;;
    Exit) clear 
          echo "Bye!";;
esac

感谢您的帮助或指向正确的方向。

1 个答案:

答案 0 :(得分:1)

要创建一个基于config.json将主机名映射到IP地址的bash数组:

declare -A ip_of

# Emit lines of the form:
# hostname localip (without quotation marks)
function hostname_ip {
 local json="$1"
 jq -r '.[] | "\(.hostname) \(.localip)"' "$json"
}

while read -r hostname ip ; do
    ip_of["$hostname"]="$ip"
done < <(hostname_ip config.json)

您可以像这样循环遍历此bash数组:

for hostname in "${!ip_of[@]}" ; do
  echo hostname=$hostname "=>" ${ip_of[$hostname]}
done

例如,假设“对话框”显示了主机名, 您可以将case语句替换为:

callssh "$sshuser" "${ip_of[$menuitem]}"