我有一个类似的服务器列表文件:
xxx ServerName1 xxx
xxx ServerName2 xxx
...
现在,我想去每个服务器从本地重命名文件。我这样的bash脚本:
#!/bin/bash
while read line
do
server=`echo $line | awk '{print $2}'` # get server name
rsh $server mv /a/b/c.txt /a/b/d.txt # rename on the server
echo "rename file in $server" # print echo
done < server.txt
但是,它仅转到第一个" severname1",重命名文件并打印回声。它永远不会输入其余的服务器,甚至没有打印回声。我不知道为什么它只是为第一个工作。
有人给我帮助吗?
不要让 rsh
吃其余的输入流 - 如果这样做,下次循环试图开始时, while read
剩下的剩下。最简单的方法是从/dev/null
重定向其STDIN:
rsh "$server" mv /a/b/c.txt /a/b/d.txt </dev/null
另外,您可以在0以外的fd上循环(请注意,在这里使用awk
是愚蠢的;您可以告诉Bash本身仅从下面的代码中选择每行的第二个字段):
while read -u 3 _ server _; do # get server name (with read)
rsh "$server" mv /a/b/c.txt /a/b/d.txt # rename on the server
echo "rename file in $server" # print echo
done 3< server.txt
解释一些可能不太明显的要点:
-
3
是文件描述符编号;它需要在-u 3
和3< server.txt
之间匹配。您可以选择使用read _ server _ <&3
而不是依赖read -u
,如果您希望代码与Bash以外的其他外壳兼容。 -
_
S吃了您不希望read
放入内容的情况。read _ server _
将第一个字段放入_
,第二个字段中server
,然后将第三个字段置于_
中。