shell是如何判断空格长度的??

说实话shell确实有些东西需要学习啊,这不又遇到麻烦了

 

shell空字符串的判断

 

 

if [ $# = 0 ]
then
echo "The paramters num is 0,return !"
return
fi

if test -z $1
then
echo "The length is 0 "
return
fi

 

 

这个是shell的一段脚本,

文件名为t9,测试用 呵呵 随便取的名字

 

调用方法1:

sh t9 

输出 :

 

The paramters num is 0,return !

没问题 

 

调用方法2:

sh t9 ""

 

输出:

The length is 0 

没问题 

 

调用方法3:

sh t9 " "  ##说明,双引号里面有一个空格

输出:

The length is 0  

问题出来了,长度为什么是0,不应该是1吗? 

真让人纠结,没办法 自己查吧 

 

网上有人呢说shell字符串为空和长度判断的问题

http://blog.163.com/awk_sed/blog/static/202442007201202011135922/

看了下 ,没有说到我的问题,

不过还好,在

写道
判断字符串为空的方法有三种:
if [ "$str" = "" ]
if [ x"$str" = x ]
if [ -z "$str" ]
注意:都要代双引号,否则有些命令会报错,养成好习惯吧!

 这一段的时候给了我灵感,”注意:都要带双引号“

是不是双引号的问题,好吧加上双引号试一下 

脚本如下 

 

if [ $# = 0 ]
then
echo "The paramters num is 0,return !"
return
fi

if test -z "$1"
then
echo "The length is 0 "
return
fi

 唯一的不同是在应用$1的时候添加了双引号,

 

看下执行结果 

直接从调用方法3开始:

 

sh t9 " "  ##说明,双引号里面有一个空格

输出:

The script is not 'yes' ##解释下,这个输出是上面这段脚本下面的脚本上面没有贴出来没关系这足以说明

哈哈 结果出来了,

有点兴奋啊,

 

等等,为什么会这样? 

 

好吧,下面是我的个人理解。

 

sh调用的时候会把脚本名(t9)后的都作为参数,

而shell解析的时候

 

if test -z $1

 这一句会先解析成 

if test -z '空格'

说明:这个空格打印出来不显示,这里用汉字替代,可以把’空格‘替换为一个空格 

 

但是shell解析的是又有一个问题,

就是基本上可以忽略空格(只保留一个,把所有的空格都看成一个,以后的全部都作为参数)

这个时候就有了问题,比较字符’-z‘后面什么参数都没有,所以一定会报错。

 

解释完毕 

 避免办法,字符串比较的时候一定要加上双引号。

 

你可能感兴趣的:(shell)