如何在bash脚本中循环执行命令列表(list.txt)?

时间:2016-06-01 16:01:08

标签: bash wget

我在txt文件中有1000个命令的列表,我想在cmd中逐个执行它们。所以我为他们写了这个循环:

for command in list.txt;
do
  $command
done

while read command
do
  $command
done < list.txt

虽然没有用!我应该IFS指出分隔符吗?命令是wget命令,如:

wget -w 3 --random-wait url -o filename

它们分别位于list.txt中的一行。最后但并非最不重要的是,有没有办法在每个命令之间做出延迟?当我复制粘贴所有命令时,它会忽略我在wget命令中指示的延迟,并且它不会很好地对待服务器!

3 个答案:

答案 0 :(得分:1)

给出bash命令的文件list.txt

echo 'Command #1'
ls -1
echo 'Command #2'
sar 1 2
echo 'Command #3'
hostname

只需运行以下命令执行文件中的所有命令:

bash list.txt

示例输出将是:

Command #1
list.txt
Command #2
Linux 2.6.32-504.16.2.el6.x86_64 (my.server.org)        06/02/2016      _x86_64_        (1 CPU)

08:56:48 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
08:56:49 AM     all      0.00      0.00      0.99      0.00      0.00     99.01
08:56:50 AM     all     16.00      0.00     14.00      1.00      0.00     69.00
Average:        all      7.96      0.00      7.46      0.50      0.00     84.08
Command #3
my.server.org

关于延迟请求,请尝试在每个命令后增加等待时间(wget -w 10)或在sleep 10文件中添加list.txt

答案 1 :(得分:1)

这是一个坏主意,但如果你必须:

while IFS= read -r line <&3; do
  line=${line%$'\r'} # trim DOS newlines
  printf 'Evaluating following line: %s\n' "$line" >&2
  eval "$line"
  sleep 1
done 3<list.txt

值得注意的项目:

  • 使用while read循环可以避免在阅读文件时涉及的许多警告。请参阅BashFAQ #1DontReadLinesWithFor。 [另外,for line in foo.txt只会迭代一次,foo.txt - 文件名本身 - 作为$line的值,因此永远不会正确]。
    • 使用-r参数read会导致反斜杠文字得到兑现。
    • 清除IFS变量可防止删除前导和尾随空格。
    • 将文件描述符3用于文件内容可防止从文件中运行的任何命令消耗stdin,从而防止文件的其余部分被运行。
  • DOS文本文件使用CRLF换行符,而UNIX文本文件使用CR。只要。 $'\r'是LF字符的bash表示; ${foo%$'\r'}是一个参数扩展,它从变量foo中删除任何尾随的LF。

答案 2 :(得分:0)

你甚至不需要一个脚本。

$ cat list.txt | xargs $command

如果你的命令一次只能处理一个参数。

$ cat list.txt | xargs -n 1 $command