清木,我想告诉你,你完善后的代码,比你完善之前错得更多。当然,也不是大错。
假设你完善后的脚本名为test2.sh
执行 bash -x test2.sh
你会发现testing=$ \netstat -tuln |grep ":80 "\)这一句,实际执行为
+ testing='$'
+ netstat -tuln
+ grep ':80 )'
也就是说,这句命令在shell看来,一行命令变成了两部分:
testing=$
netstat -tuln |grep ‘":80 "\)’ #注意,这里grep 查找的是 :80 )而非:80
最终,赋给testing的值不是 netstat -tuln |grep ":80 " 的输出结果。
你会问我修改后的脚本为什么不报之前的错误。这是因为bash允许在同一行给多个变量
赋值。它们在被解释时,被分作多行,分别执行。
\n, \是bash中的转义字符 \n代表的就是n,所以\netstat就是netstat
综上,testing=$ \netstat -tuln |grep ":80 "\) 等效于:
testing=$
netstat -tuln |grep ":80 )"
两行命令都没有语法错误,所以不会报错。当然,这也与你的本意不符。
你最初的脚本有两处错误
1. testing=$ (netstat -tuln |grep ":80 ")
$与左括号之间不能有空格
等效命令:
testing=`etstat -tuln |grep ":80 "`
# ` 在键盘上感叹号按键的左边,有波浪号的按键上
2. if [ "$testing" !="" ];then
等号与双引号之间有空格
推荐的写法:
if [ "x$testing" != "x" ];then
#防止变量为空时,出现错误。你的写法因为加上了双引号,也是不会出错的。
判断变量是否为空,千万别这么写
if [ "$testing" !="" ];
这么写是绝对会报错的
判断变量是否为空可以使用 -z
例如
if [ -z "$testing" ] ;
还有一种比较好理解的解决方法
在变量之后加任意字符。例如,要判断变量testing是否为80又要防止testing为空出错则这样写
if [ ${testing}x == 80x]
当testing为空时,表达式为80x == 80x,成立;
un为空,表达式为x == 80x ,则不成立。
也可用用
详见博客http://blog.sina.com.cn/s/blog_56ae1d580100xo6p.html
首先$和(之间不应该有空格。其次!=和“”之间必须有空格。