分页: 1 / 1

大侠帮我看看这if fi的shellscript为何会运行不正常?

发表于 : 2011-01-14 10:27
zipkong
根据鸟哥的教材写的一个shellscript
testing=$(netstat -tun | grep ":80 ") # 偵測看 port 80 在否?
if [ "$testing" != "" ]; then
echo "WWW is running in your system."
fi
testing=$(netstat -tun | grep ":22 ") # 偵測看 port 22 在否?
if [ "$testing" != "" ]; then
echo "SSH is running in your system."
fi
testing=$(netstat -tun | grep ":21 ") # 偵測看 port 21 在否?
if [ "$testing" != "" ]; then
echo "FTP is running in your system."
fi
testing=$(netstat -tun | grep ":25 ") # 偵測看 port 25 在否?
if [ "$testing" != "" ]; then
echo "Mail is running in your system."
fi

我直接netstat -tun,目前是只有tcp80端口的链接,根本没有SSH、FTP、MAIL的链接,根据以上shell的判断,运行结果照例是会只输出显示"WWW is running in your system.",但是我实际输出结果却是四个echo都显示了出来,请问为何?

Re: 大侠帮我看看这if fi的shellscript为何会运行不正常?

发表于 : 2011-01-14 10:32
灰色小狼
if判断后为什么要写分号?

Re: 大侠帮我看看这if fi的shellscript为何会运行不正常?

发表于 : 2011-01-14 10:32
eexpress
分清楚是字符串比较,还是数值比较。变量别用“”包裹。
结果赋值,根本不需要。你应该判断$?。
netstat -tun | grep ':80 '
[ $? ] && echo no || echo yes

Re: 大侠帮我看看这if fi的shellscript为何会运行不正常?

发表于 : 2011-01-14 17:41
huangyun
我这里运行你的脚本是正常的,我测试了启动和不启动WWW,启动和不启动SSH,结果如预期。

Re: 大侠帮我看看这if fi的shellscript为何会运行不正常?

发表于 : 2011-01-14 18:33
astolia
在代码前加个
set -x
再运行看看问题出在哪里

Re: 大侠帮我看看这if fi的shellscript为何会运行不正常?

发表于 : 2011-01-21 9:53
byZh
楼主的脚本是可以正常运行的,但根据楼主的命令判断会出问题
我的系统根本没有运行WEB服务,但脚本输出“WWW is running in your system.”
其实只是我的系统访问外面的web服务,所以还是根据ps命令的输出来判断比较靠谱
另外我比较习惯下面的写法:
[bash]
if ps -ef | grep [h]ttpd >/dev/null 2>&1;then #httpd服务
echo "WWW is running in your system."
fi
[/bash]

Re: 大侠帮我看看这if fi的shellscript为何会运行不正常?

发表于 : 2011-01-21 22:30
fanhe
是不是你的sh版本问题?
还有,测试字符串是否为空,兼容性最好的方法是

代码: 全选

[ x"$var" = x ]
或者,好看的方法是

代码: 全选

[ -z "$var" ]
还有,变量用双引号引起来是很好的习惯,除非你的是数值

Re: 大侠帮我看看这if fi的shellscript为何会运行不正常?

发表于 : 2011-01-24 9:54
tusooa

代码: 全选

tlcr: 0 庚寅年十二月廿一日 9:48 ~ 
● dog > /tmp/test
testing=$(netstat -tun | grep ":80 ") # 偵測看 port 80 在否?
if [ "$testing" != "" ]; then
echo "WWW is running in your system."
fi
testing=$(netstat -tun | grep ":22 ") # 偵測看 port 22 在否?
if [ "$testing" != "" ]; then
echo "SSH is running in your system."
fi
testing=$(netstat -tun | grep ":21 ") # 偵測看 port 21 在否?
if [ "$testing" != "" ]; then
echo "FTP is running in your system."
fi
testing=$(netstat -tun | grep ":25 ") # 偵測看 port 25 在否?
if [ "$testing" != "" ]; then
echo "Mail is running in your system."
fi
tlcr: 0 庚寅年十二月廿一日 9:48 ~ 
● bash /tmp/test 
WWW is running in your system.
tlcr: 0 庚寅年十二月廿一日 9:48 ~ 
● dash /tmp/test
WWW is running in your system.
tlcr: 0 庚寅年十二月廿一日 9:48 ~ 
● sh /tmp/test 
WWW is running in your system.
tlcr: 0 庚寅年十二月廿一日 9:48 ~ 
● 
肯定是没问题