为什么 while 循环和 for 循环的行为不同?

为什么 while 循环和 for 循环的行为不同?

我正在尝试从文件中读取用户和服务器详细信息tempo.txt,然后使用另一个脚本检查该 unix 帐户上文件系统的磁盘空间使用情况server_disk_space.sh。但我无法弄清楚为什么 while 循环仅适用于第一行和 for 循环工作正常。请帮助我理解这一点。

使用 while 循环

#!/usr/bin/ksh
while read line
do
r1=`echo $line | cut -d"#" -f1`;
r2=`echo $line | cut -d"#" -f2`;
apx_server_disk_space.sh $r2 $r1
done<tempo.txt

输出

8

使用for循环

#!/usr/bin/ksh
for line in $(cat tempo.txt)
do
r1=`echo $line | cut -d"#" -f1`;
r2=`echo $line | cut -d"#" -f2`;
apx_server_disk_space.sh $r2 $r1
done

输出

8
23
54
89
12

内容server_disk_space.sh

#!/usr/bin/ksh
user=$1
server=$2
count=`ssh ${user}@${server} "df -h ."`
echo ${count} | awk '{print $12}' | tr -d %

Use percentage上面的脚本输出任何服务器上的磁盘使用情况的值。


内容tempo.txt

abclin542#abcwrk47#
abclin540#abcwrk1#
abclin541#abcwrk2#
abclin543#abcwrk3#
abclin544#abcwrk33#

答案1

除非您将-n选项添加到ssh,否则ssh将从其标准输入中读取,在 while 循环的情况下是 tempo.txt 文件。

或者,您可以使用不同的文件描述符来读取 tempo.txt 文件:

#! /usr/bin/ksh -
while IFS='#' read <&3 -r r1 r2 rest; do
  apx_server_disk_space.sh "$r2" "$r1"
done 3< tempo.txt

如果这些服务器是 GNU/Linux 服务器,您的 ssh 脚本可能是:

#! /bin/sh -
ssh -n "$1@$2" 'stat -fc "scale=2;100*(1-%a/%b)" .' | bc

这可能会更强大且面向未来。

相关内容