懂shell脚本的来看看,这个( )>>$logfile是什么意思?,还有while read line;是什么意思?请教了。

IP_LIST="127.0.0.1 0.0.0.0"
# 提供远程主机IP地址列表
(
for ip in $IP_LIST
do
ssh slynux@$ip 'df -H' | grep ^/dev/ > /tmp/$$.df

while read line;
do
cur_date=$(date +%D)
printf "%-8s %-14s " $cur_date $ip
echo $line | awk '{ printf("%-9s %-8s %-6s %-6s %-8s", $1,$2,$3,$4,$5); }'

pusg=$(echo $line | egrep -o "[0-9]+%")
pusg=${pusg/\%/};
if [ $pusg -lt 80 ];
then
echo SAFT
else
echo ALERT
fi
done< /tmp/$$.df
done
)>>$logfile

( ) >>$logfile

( )中的语句会在新建shell中执行(产生一个新进程),其中任何语句的标准输出都会被重定向到log文件$logfile中去(追加写方式)。

 

while read line
do
   ......
done </tmp/$$.df

读取文件/tmp/$$.df,read命令每次读取一行内容,所以while循环的每次迭代都只处理该文件的一行内容(变量line)。

$$ 表示当前进程的PID,最常见的用途就是用作临时文件的名字以保证文件名不重复。

追问

pusg=${pusg/\%/}; 这句是把%去掉?还是显示匹配的有%的行?最后重新赋值

追答

这是字符串替换方法。

看下面的例子就明白:

作用就是去除第一个%(将第一次出现的%替换为空)。%有特殊含义,前面需要加转义符。


${x/a/b} 

将字符串x中的第一个a替换为b。

echo ${x//a/b} 

将字符串x中的所有a都替换为b。

追问

是我的for语句写错了,少了个in


改了就好了,


但是执行后说最后一行ambiguous redirect

追答

你的logfile也写错了,脚本第二行。

追问

其他的都改了,也能执行了,但是这一行应该有问题,

执行之后提示

如果改成

又提示:

改成:

又变成这样了:

不知道怎么是对的...    唉,麻烦你了 

追答

grep ^/dev/ 这样的写法貌似是不正确的。
grep中的正则不需要加 / / 这种形式。

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网