代码之家  ›  专栏  ›  技术社区  ›  Vasiliy Stepulo

在while循环中使用EOF的bash帮助

  •  0
  • Vasiliy Stepulo  · 技术社区  · 9 年前

    我有一个脚本,它逐行读取一些输入信息,然后进入循环,然后,在循环中,它根据从输入信息中获取的信息创建带有一些扩展变量的json文件,这些信息有时会有所不同。

    您能建议如何重写脚本以避免使用EOF函数中断while循环吗

    while IFS= read -r snmp_cred; do
    echo appliance $ADDM_address and $snmp_cred 
    snmp_ip=$(grep -E -o "([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})@" <<< $snmp_cred)
    snmp_ip=${snmp_ip%?}
    echo IP for snmp community is $snmp_ip
    
    json_file=$DIR/cred.json
    remote_dir=/some/remote/dir
    
    cat <<EOF > $DIR/cred.json
        {
            "some", 
            "json,          
        }
    EOF
    
    
    [Here goes some another commands]
    
    done <$DIR/input.txt
    
    1 回复  |  直到 9 年前
        1
  •  0
  •   chepner    9 年前

    代码看起来不错,但您可以避免使用 cat 全部在这里。只是使用 echo printf .

    printf '\
    { 
      "ip_range" : "%s",
      "types" : [ "snmp" ],
      "description" : "%s",
      "snmp.version": "v2c",
      "snmp.port" : 161,
      "snmp.community" : "%s",
      "snmp.retries" : 3,
      "snmp.timeout" : 2 }' "$snmp_ip" "$snmp_cred" "$snmp_cred" > "$json_file"
    

    通常,一旦您尝试生成动态JSON,就必须担心参数值是否被正确编码。在这种情况下,您可能需要考虑使用以下工具生成JSON jq 而不是手动构建。

    jq -n --arg ipr "$ip_range" --arg cred "$snmp_cred" '{ 
      "ip_range" : $ipr,
      "types" : [ "snmp" ],
      "description" : $cred,
      "snmp.version": "v2c",
      "snmp.port" : 161,
      "snmp.community" : $cred,
      "snmp.retries" : 3,
      "snmp.timeout" : 2 }' > "$json_file"
    
    推荐文章