国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網 責編:小采 時間:2020-11-09 08:13:55
文檔

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

Bash實用技巧:同時循環兩個列表:摘要: 你會學到一種原創的同時循環兩個列表的方法。類似于Python或者Haskell的zip函數,非常簡潔直觀,效果如下: $ paste ( seq 1 5 ) ( seq 129 133 ) | while read host ip; do echo vm$host: 172.16.116.$ip
推薦度:
導讀Bash實用技巧:同時循環兩個列表:摘要: 你會學到一種原創的同時循環兩個列表的方法。類似于Python或者Haskell的zip函數,非常簡潔直觀,效果如下: $ paste ( seq 1 5 ) ( seq 129 133 ) | while read host ip; do echo vm$host: 172.16.116.$ip

摘要: 你會學到一種原創的同時循環兩個列表的方法。類似于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

摘要:

你會學到一種原創的同時循環兩個列表的方法。類似于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個及以上同等長度的列表,而且非常直觀。就是開頭提到的方法。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

Bash實用技巧:同時循環兩個列表:摘要: 你會學到一種原創的同時循環兩個列表的方法。類似于Python或者Haskell的zip函數,非常簡潔直觀,效果如下: $ paste ( seq 1 5 ) ( seq 129 133 ) | while read host ip; do echo vm$host: 172.16.116.$ip
推薦度:
標簽: 兩個 列表 學到
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 精品欧美一区二区三区 | 日本三级全黄三级a | 亚洲一区 中文字幕 久久 | 成人国产精品一区二区网站 | 最新亚洲 | 欧美一区二区免费 | 国产正在播放 | 国产国语高清在线视频二区 | 欧美在线视频网 | 欧美日韩亚洲视频 | 欧美日本道免费一区二区三区 | 国产在线精品一区二区三区 | 国产精品色综合久久 | 国产精品一区二区久久不卡 | 日本亚欧乱色视频在线观看 | 午夜一区二区三区 | 欧美人善交 | 日韩欧美一区二区在线观看 | 精品国产免费一区二区三区五区 | 日韩在线播放一区 | 久久精品99久久香蕉国产色戒 | 极品国产高颜值露脸在线 | 天天操综 | 在线观看精品国产 | 日本全黄 | 欧美日韩精品一区二区三区视频在线 | 国产欧美精品综合一区 | 国产成人夜色91 | 在线精品亚洲欧洲第一页 | 永久免费观看的毛片的网站下载 | 永久免费观看的毛片的网站下载 | 日韩亚射| 韩国女主播vip | 久久久久国产成人精品亚洲午夜 | 精品国产免费一区二区三区五区 | 久久中文网 | 看全色黄大色黄女片爽毛片 | 日本一区二区三区免费看 | 亚洲国产精品免费在线观看 | 一区二区三区成人 | 一级毛片免费看 |