2017-02-10 148 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