代码之家  ›  专栏  ›  技术社区  ›  Syed Quadri

循环通过4个不同文本文件的BASH脚本

  •  1
  • Syed Quadri  · 技术社区  · 7 年前

    我试图创建一个BASH脚本,它从四个不同的文本文件中获取数据,并将每个文本文件中的每一行分配给一个变量,然后使用这些变量运行命令。我已经构建了一个for循环来完成此任务,但我面临的挑战是for循环没有进行一对一映射。

    我希望这个循环遍历每一行,每一行运行一次命令,并在到达EOF时停止循环。当我运行这个脚本时,我得到如下输出:;

    The username is jsmith The hostname is 0000-Ubuntu The description is P-Ubuntu The IP is 0.0.0.0/24
    
    The username is jsmith The hostname is 0000-Ubuntu The description is P-Ubuntu The IP is 1.1.1.1/24
    
    The username is jsmith The hostname is 0000-Ubuntu The description is P-Ubuntu The IP is 2.2.2.2/24
    

    我需要这是一个一个映射;例如:

    The username is jsmith The hostname is 0000-Ubuntu The description is P-Ubuntu The IP is 0.0.0.0/24
    
    The username is pstone The hostname is 1111-Ubuntu The description is P-Ubuntu The IP is 1.1.1.1/24
    
    The username is drogers The hostname is 3333-Ubuntu The description is P-Ubuntu The IP is 3.3.3.3/24
    

    等等

    正如您所知,我是bash脚本的新手,非常感谢您的指导/帮助。

    谢谢

    #!/bin/bash
    HOSTNAMES=$(cat /home/squadri/hostnames.txt)
    DESCRIPTIONS=$(cat /home/squadri/descriptions.txt)
    USERNAMES=$(cat /home/squadri/usernames.txt)
    IPS=$(cat /home/squadri/ips.txt)
    
    for i in $HOSTNAMES ; do
    for j in $DESCRIPTIONS ; do
    for k in $USERNAMES ; do
    for l in $IPS ; do
            echo "The username is $k"
            echo "The hostname is $i"
            echo "The description is $j"
            echo "The IP is $l"
                done
           done
         done
    done
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Thomas    7 年前

    您可以使用 paste 命令:

    paste /home/squadri/{hostnames,descriptions,usernames,ips}.txt |\
    while read hostname description username ip; do
        echo "The username is $username"
        echo "The hostname is $hostname"
        echo "The description is $description"
        echo "The IP is $ip"
    done
    

    这种方法的一个潜在陷阱是文件中的空白字符,但如果文件中的任何一行中都没有空白字符,那么它应该可以正常工作。

        2
  •  0
  •   chepner    7 年前

    读取4个不同的文件描述符:

    while IFS= read -r hostname;
          IFS= read -r description <&3;
          IFS= read -r username <&4;
          IFS= read -r ip <&5; do
      echo "The username is $username"
      echo "The hostname is $hostname"
      echo "The description is $description"
      echo "The IP is $ip"
    done < hostnames.txt 3< descriptions.txt 4< usernames.txt 5< ips.txt
    

    从技术上讲,这读到 descriptions.txt ,而不考虑其他文件的长度。要在最短文件结束时停止,请将命令与 && :

    while IFS= read -r hostname &&
          IFS= read -r description <&3 &&
          IFS= read -r username <&4 &&
          IFS= read -r ip <&5; do
      echo "The username is $username"
      echo "The hostname is $hostname"
      echo "The description is $description"
      echo "The IP is $ip"
    done < hostnames.txt 3< descriptions.txt 4< usernames.txt 5< ips.txt
    

    迭代直到到达最长文件的末尾有点复杂(您不能简单地将命令与 || ),因此,除非有人要求,否则我将把它作为练习留给感兴趣的读者。