我正在尝试从文件中读取用户和服务器详细信息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
这可能会更强大且面向未来。