如何在bash中编写带有2个变量的for循环?

时间:2015-09-15 02:21:33

标签: bash loops for-loop

我将数据库中已存在的冲突数字的输出与新的插入请求排序到文件名输出。 这是文件的输出。

    cat output
    DataBase: (9999999999)  NewDB_insert: (999-999-9999)
    DataBase: (1111111111)  NewDB_insert: (111-111-1111)
    DataBase: (2222222222)  NewDB_insert: (222-222-2222)
    DataBase: (3333333333)  NewDB_insert: (333-333-3333)

我想运行相同的命令,显示来自具有冲突的同一行的信息。该命令只是提取数据库信息。

          showinfo -id 9999999999
          ID:9999999999
          Name: Mr.Brown
          City: New York
          Company: Acme
          Client: 1245

         showinfo -id 999-999-9999
         ID:999-999-9999
         Name: Mr.Brown
         City: New York
         Company: Acme
         Client: 1245

我想使用2个变量将输出从名为output的文件发送到屏幕。所以我会从我的文件中获得以下信息。

         **From DB:**
         ID:9999999999
         Name: Mr.Brown
         City: New York
         Company: Acme
         Client: 1245

             **From NewDB_insert:**
             showinfo -id 999-999-9999
             ID:999-999-9999
             Name: Mr.Brown
             City: New York
             Company: Acme
             Client: 1245

所以基本上我会在一个带有一个变量的for循环中捕获文件。

for i  in `cat output | awk '{print $2}' | tr -d ")("`;do echo == From DB:==;showinfo -id $i; echo ==========;done

这给了我所需要的第一部分。我在网上查看并且无法使用任何示例来创建包含2个变量的for循环。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:2)

简短的回答可能是:“你没有”。

您可能最好使用whileread

sed -e 's/[^(]*(\([^)]*\))[^(]*(\([^)]*\)).*/\1 \2/' output |
while read a b
do
    echo == From DB ==
    showinfo -id $a
    echo =============
    echo == From NewDB_Insert ==
    showinfo -id $b
    echo =======================
done

如果您认为数据中可能存在令人讨厌的字符,尤其是反斜杠,则可以使用read -r,并在"$a"行中引用"$b"showinfo 。如果你确定不会有任何这样的字符,你可以(只是)用所写的代码确定。

请注意,循环完成时,无法访问在while循环中设置的任何变量。如果问题确实存在问题,可以解决这个问题。

sed脚本查找:

  • 零或多个非开括号
  • 一个左括号
  • 捕获零个或多个非近似括号
  • 停止捕获
  • 一个紧密的括号
  • 零以上非开放括号
  • 一个左括号
  • 捕获更多非近似括号的零
  • 停止捕获
  • 一个紧密的括号
  • 零个或多个其他字符

并将其替换为两个以空格分隔的捕获字符串(例如9999999999999-999-9999)。