我在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命令中指示的延迟,并且它不会很好地对待服务器!
答案 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 #1和DontReadLinesWithFor。 [另外,for line in foo.txt
只会迭代一次,foo.txt
- 文件名本身 - 作为$line
的值,因此永远不会正确]。
-r
参数read
会导致反斜杠文字得到兑现。IFS
变量可防止删除前导和尾随空格。$'\r'
是LF字符的bash表示; ${foo%$'\r'}
是一个参数扩展,它从变量foo
中删除任何尾随的LF。答案 2 :(得分:0)
你甚至不需要一个脚本。
$ cat list.txt | xargs $command
如果你的命令一次只能处理一个参数。
$ cat list.txt | xargs -n 1 $command