2017-02-10 185 views
2

尊敬的同事,For循環遍歷IP和主機名

我正在尋找更好的慶典方式/方法創建一個循環,以適應我的要求,我有一個命令被稱爲「ldaphost」其中一個IP地址分配給具有以下提供的syntex的主機。

例子:

$ ldaphost --insert "192.168.1.1 mytestvm1" 

雖然我在下面的for循環這是工作,我作爲一個變通截至目前,另外尋找與bash或外殼相同的專家,更好的巧妙的解決辦法。

要求是:

我有一個IP範圍192.168.1.1192.168.1.254和相同的格式主機名作爲mytestvm1mytestvm254其中我加入到我下面的腳本。

#!/bin/bash 

for ip in {1..254} 
do 
ldaphost --insert "192.168.1.${ip} mytestvm${ip}" 
done 

還有一兩件事我想知道,如果我們可以作爲預答案添加密碼進入劇本,因爲這是詢問密碼在每個迭代上..

bash-4.1$ cat reservHost.sh 
#!/bin/bash 
for ((i = 13 i <= 15; i++)); do 
    ldaphost --insert "1192.168.1.$i mytestvm$i" 
done 

bash-4.1$ ./reservHost.sh 
Password: 
Inserted: 192.168.1.13 mytestvm13 
Password: 
Inserted: 192.168.1.14 mytestvm14 
+0

你能澄清你的問題是什麼嗎? – Chiru

+2

我真的不認爲有一個更好的方法是不完全不可讀和可維護的。您提供的代碼似乎與其將要獲得的一樣好。不錯的工作! –

+0

@Chiru我期待着如果在bash中有更好的方法來實現我創建的同一個腳本。可能在數組中有IP和主機名等值,我只是學習者。 – krock1516

回答

1

你這樣做是正確的,因爲:大括號擴展和循環清晰,簡潔,高效。

由於@chepner注意,你可能會使用C語言風格的結構有更高效的循環:

for ((i = 1; i <= 254; i++)); do 
    ldaphost --insert "192.168.1.$i mytestvm$i" 
done 

你也可以選擇使用xargs代替循環:

xargs -a<(echo -n {1..254}) -INNN -d' ' -n1 ldaphost --insert "192.168.1.NNN mytestvmNNN" 

一優於for的是,這種方法是平凡:可並行化:只需將-P 0添加到xargs命令行即可運行儘可能多的儘可能。

+0

C風格for循環會更有效率,因爲它不需要在啓動循環體之前生成完整序列。儘管只有255個值,但這並不是什麼大不了的。 – chepner

+0

@chepner確實。更新,謝謝! – bishop

+0

那麼,用一個Bash循環,你也可以通過在循環內部附加'&'命令來簡化它,儘管這會導致創建254個進程(這可能不會像現代OS /計算機那樣糟糕被關注到)。 – Fred