用于存储命令输出的变量的字符串的Shell脚本

时间:2016-08-24 21:36:02

标签: bash shell awk ksh

我正在尝试使我的工作更轻松的东西。所以我在这里有一个脚本,它将从diff文件中收集IP。问题是awk的输出没有存储/错误的语法是错误的。我正在使用bash。

MGR${count_IP}=$(awk -F '[=;]' '{print $2}' "${MgrFile}")
echo "Test=MGR${count_IP}"

for (( count=1;count<=$Manager_Count;count++))
do
    MasterFile=/etc/ansible/tmp/tmp_list
    MgrFile=/etc/ansible/tmp/tmp_mgr$count
    echo "$count-$MgrFile"

    grep -r "Manager_$count" $MasterFile > "${MgrFile}"
    echo "Copy List of IP and name Info to temp file"

    echo "Get MGR$count IP"
    MGR${count_IP}=$(awk -F '[=;]' '{print $2}' "${MgrFile}")
    echo "MGR${count_IP}"
done

问题部分

    echo "Get MGR$count IP"
    MGR${count_IP}=$(awk -F '[=;]' '{print $2}' "${MgrFile}")
    echo "MGR${count_IP}"

日志:

 1-/etc/ansible/tmp/tmp_mgr1
 Copy List Info to temp file
 Get MGR1 IP
 ./2.sh: line 47: MGR=172.16.16.11: command not found
 MGR
 2-/etc/ansible/tmp/tmp_mgr2
 Copy List Info to temp file
 Get MGR2 IP
 ./2.sh: line 47: MGR=172.16.16.14: command not found
 MGR

2 个答案:

答案 0 :(得分:-1)

没有任何其他方向,shell将只评估每一行/表达式一次。但是,您正在做一些特别的事情:您要为不是常量的变量名赋值(即,其名称包含必须在赋值之前展开的变量)。这意味着你必须告诉shell两次评估表达式;一次扩展变量名,第二次为变量赋值。因此,您需要在遇到问题的行前面eval

eval MGR${count_IP}=$(awk -F '[=;]' '{print $2}' "${MgrFile}")

第一遍将产生例如。

MGR47=172.16.16.11(或其他)

第二遍(eval实际上正在做的事)将实际执行该任务。

编辑:OP可以通过其他方式编写自己的脚本,但在OP的示例中,我将答案局限于可移植,简单且无害的 这将解决他的问题。一位评论者指出,不加选择地使用eval可能会导致意想不到的后果,例如天网的崛起,蝗虫群的出现或整个硬盘被删除。如果您想进一步了解这个问题,请阅读链接的SO问题:

Why should eval be avoided in Bash, and what should I use instead?

答案 1 :(得分:-2)

这看起来像一个简单的混淆:

  • 您的变量被称为$count_IP,直到问题部分的第一行
  • 之后
  • 称为echo "Get MGR$count IP" eval "MGR$count=\$(awk -F '[=;]' '{print \$2;}' '$MgrFile')" echo "MGR${count}"

所以

 protected String doInBackground(String... params) {

    String reg_url = "http://MyIPAddress:ServerPort#/Register.php"; 



        String name = params[1];
        String user_name = params[2];
        String user_pass = params[3];


        try { 


            URL url = new URL(reg_url); 

            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

            httpURLConnection.setRequestMethod("POST"); 
            httpURLConnection.setDoOutput(true);

            OutputStream OS = httpURLConnection.getOutputStream(); 

            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS, "UTF-8"));


            String data = URLEncoder.encode("user", "UTF-8") + "=" + URLEncoder.encode(name, "UTF-8") + "&" +
                    URLEncoder.encode("user_name", "UTF-8") + "=" + URLEncoder.encode(user_name, "UTF-8") + "&" +
                    URLEncoder.encode("user_pass", "UTF-8") + "=" + URLEncoder.encode(user_pass, "UTF-8");


            bufferedWriter.write(data);
            bufferedWriter.flush();
            bufferedWriter.close();
            OS.close();


            return "Registration Success!";


        } catch (MalformedURLException e) {

            e.printStackTrace();

        } catch (IOException e) { 

            e.printStackTrace();
        }


    return null;

}

应该有效