<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Bash實用技巧:同時循環兩個列表

      摘要:

      你會學到一種原創的同時循環兩個列表的方法。類似于Python或者Haskell的zip函數,非常簡潔直觀,效果如下:

      $ paste <(seq 1 5) <(seq 129 133) | while read host ip; do echo "vm$host: 172.16.116.$ip"; done
      
      vm1: 172.16.116.129
      vm2: 172.16.116.130
      vm3: 172.16.116.131
      vm4: 172.16.116.132
      vm5: 172.16.116.133

      詳情:

      在實際應用中,經常需要我們輸入對應的兩個列表,比如主機名和IP:

      vm110 172.18.11.129
      
      vm111 172.18.11.130
      
      ...

      如果有很多的話,使用awk處理一個臨時文件,然后使用while read來循環是不錯的(例如從Excel里面拷貝成文本文件,然后用awk提取相應的列到一個文件):

      awk '{print $1 $3}' orig.txt | while read host ip; do echo $host : $ip; done < temp.txt

      但是,有沒有能直接在命令行上生成這些列表并循環的方法呢?因為我更喜歡用for i in vm{110..120}; do echo $i; done這種方式來循環列表,但是這種方式只支持一個列表,怎么找到對應的另一個列表呢?

      直接google,就會發現沒有什么好的方法(以下均來自StackOverflow):

      1、有的直接使用bash的數組甚至hash表,都是較新的版本才有,然后使用數字index來循環。這種方法一點也不直觀:

      list1="a b c"
      list2="1 2 3"
      array1=($list1)
      array2=($list2)
      
      count=${#array1[@]}
      for i in `seq 1 $count`
      do
          echo ${array1[$i-1]} ${array2[$i-1]}
      done

      誰也不想寫類似${#array1[@]}這樣的復雜表達,因為我們不是在編程,而是在輸入一條命令。

      2、有的使用了各種正則表達式命令,我一眼看不出來什么意思,沒人會為了循環兩個列表,去專門寫一個腳本文件:

      #!/bin/sh
      list1="1 2 3"
      list2="a b c"
      while [ -n "$list1" ]
      do
          head1=`echo "$list1" | cut -d ' ' -f 1`
          list1=`echo "$list1" | sed 's/[^ ]* *\(.*\)$/\1/'`
          head2=`echo "$list2" | cut -d ' ' -f 1`
          list2=`echo "$list2" | sed 's/[^ ]* *\(.*\)$/\1/'`
          echo $head1 $head2
      done

      還有其他幾種,有興趣的可以去看看,http://stackoverflow.com/questions/546817/iterating-over-two-lists-in-parallel-in-bin-sh

      但是有一種方法提醒了我:

      list1="aaa1 aaa2 aaa3"
      list2="bbb1 bbb2 bbb3"
      
      tmpfile1=$( mktemp /tmp/list.XXXXXXXXXX ) || exit 1
      tmpfile2=$( mktemp /tmp/list.XXXXXXXXXX ) || exit 1
      
      echo $list1 | tr ' ' '\n'  > $tmpfile1
      echo $list2 | tr ' ' '\n'  > $tmpfile2
      
      paste  $tmpfile1  $tmpfile2
      
      rm --force $tmpfile1  $tmpfile2

      這種方法創建了兩個臨時文件,好像還不如前面的方法,但是在我看來,這很有啟發性:他使用了paste來結合兩個列表,這是linux下原生的合并列表命令,相當于其他語言的zip。

      另外,臨時文件也可以避免,因此我想出了以下的方法(并不推薦):

      paste <(echo vm{1..5} | tr ' ' '\n') <(echo 172.16.116.{129..133} | tr ' ' '\n') | while read host ip; do echo $host: $ip; done

      其中vm{1..5}會產生“vm1 vm2 vm3 vm4 vm5”,以空格分隔,而paste是把兩個列文件合并成一個,所以必須把空格替換成換行,這就是tr做的事。明顯使用tr很不好,增加了命令的復雜度。

      另外<()是執行一個命令,并把這個命令輸出當作一個文件的意思。

      于是我想到了seq,好像可以指定分隔符,一查文檔,居然默認就是換行,于是命令得以大幅簡化:

      paste <(seq 1 5) <(seq 129 133) | while read host ip; do echo "vm$host: 172.16.116.$ip"; done

      這個命令可以循環2個及以上同等長度的列表,而且非常直觀。就是開頭提到的方法。

      posted @ 2014-05-01 00:48  Leading  閱讀(7292)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 婷婷色婷婷深深爱播五月| 色老99久久九九爱精品| 国产精品无遮挡猛进猛出| 欧美黑人性暴力猛交在线视频 | 国产午夜福利视频第三区| 亚洲精品麻豆一区二区| 国产精品黄色片| 国产精品久久久久影院色| 色综合色综合色综合久久| 国产精品美人久久久久久AV| 亚洲国产精品综合久久2007| 成人免费无码不卡毛片| 二区三区亚洲精品国产| 亚洲精品久久久久成人2007| 久久亚洲女同第一区综合| 久久精品视频这里有精品| 国产亚洲av夜间福利香蕉149 | 日韩加勒比一本无码精品| 熟妇人妻系列aⅴ无码专区友真希| 免费观看成人毛片a片| 亚洲欧美牲交| 亚洲色成人网站www永久四虎| 欧美人成精品网站播放| 91麻豆视频国产一区二区| 激情国产一区二区三区四区小说| 人妻系列无码专区免费| 玩两个丰满老熟女久久网| 免费人成黄页在线观看国产| 车险| 精品午夜福利短视频一区| 少妇高潮水多太爽了动态图| 日本特黄特黄刺激大片 | 无码专区视频精品老司机| 国产精品一区二区黄色片| 久久永久视频| 一区二区三区无码免费看| 亚洲熟妇自偷自拍另亚洲| 久久久无码精品亚洲日韩蜜臀浪潮| 人妻内射一区二区在线视频| 久热这里只有精品12| 大肉大捧一进一出好爽视频动漫|