Shell编程 - 如何循环列表并一次处理N?

时间:2013-10-03 18:20:55

标签: list shell loops

我试图通过列表读取,我想在列表中一次读取25个,然后睡5秒钟,然后一次读取25个,直到我耗尽列表。

这就是我现在正在做的事情,但我同时开始了太多的ssh会话。我希望能够运行25,睡5秒,再运行25,直到列表用完为止。

cat ctrlnodes.txt |\
while read N
do
ssh -n $N "/var/opt/OV/bin/instrumentation/agent_health.sh" &
done

3 个答案:

答案 0 :(得分:0)

for i in $(seq 1 100 )
do

    for j in $(seq 1 25)
    do
    # suppose you have an array
        echo ${your_list[i]}
    done

    sleep 5
done

答案 1 :(得分:0)

让我们创建一个包含一个整数/行,100行的文件:

$ seq 1 100 > data

使用以下脚本:

#!/bin/bash

n=1
while read N
do
    # here you call your ssh
    if [ $((n % 25)) -eq 0 ]
    then
        echo "Spawned 25 subprocesses, waiting..."
        echo $n, $N
        # wait for all subprocesses to finish before continuing
        # Replace 'wait' with 'sleep 5' if that's desired
        wait
    fi
    ((n+=1))
done < data

输出:

$ ./s.sh 
Spawned 25 subprocesses, waiting...
25, 25
Spawned 25 subprocesses, waiting...
50, 50
Spawned 25 subprocesses, waiting...
75, 75
Spawned 25 subprocesses, waiting...
100, 100

答案 2 :(得分:0)

答案

counter=0
while read N; do
   ((counter++))
   ssh -n $N "/var/opt/OV/bin/instrumentation/agent_health.sh" &
   [[ $(($counter % 25)) = 0 ]] && sleep 5
done <ctrlnodes.txt

解释

首先,计数器需要在循环之前初始化,并在每次迭代时递增;这允许脚本测试它是否在可被25整除的迭代中。

其次,您需要将文本文件的cat管道更改为whiledone上的直接输入重定向;当您使用前者时,会创建一个子shell,$counter将超出范围,并且不会正确递增。

最后,可能需要最多解释的是均匀可分的测试本身:

[[ $(($counter % 25)) = 0 ]] && sleep 5

这样做是为了测试计数器的模数25是否为零。 (即,$counter可被25整除,如果是,那么测试的退出值为真,那么'和'(&&)可以继续sleep }命令如果模数值不为零,那么&&将不会继续,因为测试将具有错误的退出值。

概念的单线测试:

seq 1 100 >numbers.txt && counter=0 && while read N; do ((counter++)); echo $N; [[ $(($counter % 25)) = 0 ]] && echo -n sleeping... && sleep 5 && echo; done <numbers.txt

你应该看到的是25个数字的块,一个“睡觉......”线,暂停5秒,直到它完成所有1..100。