使用文件

时间:2016-03-18 13:36:04

标签: arrays linux bash shell

我正在尝试创建一个shell脚本,它读取配置文件并并行执行每行的命令。

例如,我有IPs.cfg,它可以包含可变数量的IP。它可能是一个或几个

IPs.cfg

145.x.x.x
176.x.x.x
192.x.x.x

我想读取文件,然后同时为每一行执行命令...例如:

scp test.iso root@$IP1:/tmp &
scp test.iso root@$IP2:/tmp &
scp test.iso root@$IP3:/tmp &
wait

我认为这是我将IP存储到数组中的方式

IFS=$'\n' read -d '' -r -a array < IPs.cfg

然后我从文件中提取行数并将其减少1,因为数组从0开始。

NUMLINES=`cat IPs.cfg | wc -l`
NUMLINES=$((NUMLINES-1))

现在我想同时执行所有命令。这是一个可变数量的参数,所以我不能只手动使用scp test.iso root@${array[0]}:/tmp & scp test.iso root@${array[1]}:/tmp & so on。我可以使用while循环,但这意味着一次只能执行一个命令。我也在考虑使用递归,但我从未在bash脚本中这样做过。

这可能是一个愚蠢的问题,但我的选择是什么?

3 个答案:

答案 0 :(得分:2)

您可以使用GNU parallel

答案 1 :(得分:1)

循环应如下所示:

while read -r ip ; do
   scp test.iso "root@$ip:/tmp" &
done < IPs.conf
wait

答案 2 :(得分:0)

通过这个技巧,您可以控制同时运行的同时进程数:

cat IPs.conf | xargs -n1 -I{} -P10 scp test.iso "root@{}:/tmp"

检查-p10这意味着同时使用10个进程。