【问题标题】:How do I write a for loop with 2 variables in bash?如何在 bash 中编写带有 2 个变量的 for 循环?
【发布时间】:2015-09-15 02:21:32
【问题描述】:

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

    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 循环。任何帮助,将不胜感激。

【问题讨论】:

    标签: bash loops for-loop


    【解决方案1】:

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

    您可能最好使用带有readwhile 循环。

    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 并且可以在 showinfo 行中引用 "$a""$b"。如果您确定不会有任何此类字符,那么您(几乎)对编写的代码没问题。

    请注意,在循环完成时,while 循环中设置的任何变量都将不可访问。如果它确实是一个问题,有办法解决这个问题。

    sed 脚本查找:

    • 零个或多个非开括号
    • 左括号
    • 捕获零个或多个非右括号
    • 停止捕获
    • 右括号
    • 零个非开括号
    • 左括号
    • 捕获零个非右括号
    • 停止捕获
    • 右括号
    • 零个或多个其他字符

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

    【讨论】:

    • 做得很好。 +1。 FWIW,另一种可能更简单的提取字符串的方法是awk -F'[()]' '{print $2, $4}'
    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多