接触shell也有好几年了,近几年主要从事使用shell操作数据库的工作。对于执行结果的返回值进行判断的情形比较多,而对于字符串的判断与比较用得相对较少。所以有时候需要用一下一时也记不太清,有必要整理一下相关的用法。
一、字符串的比较
(1)表达式可以使用test或者[],效果是一样的
比较字符串的一般用法如下:
#!/bin/bash
s1="test1"
s2="test"
s3="test"
#表达式可以使用test或者[],效果是一样的。
if test $s1 = $s2
then
echo -e "两个字符串相等!"
else
echo -e "\e[1;5;31m两个字符串不相等! \e[0m"
fi
if [ $s1 = $s2 ]
then
echo -e "两个字符串相等!"
else
echo -e "\e[1;5;31m两个字符串不相等! \e[0m"
fi
以上两种方式都将输出“两个字符串不相等”。
(2)比较符号使用=或==都可以,由于之前学习的java,我一般将=理解为赋值符号,所以基本使用的==。
if [ "$s1" == "test1" ]
then
echo -e "\e[1;5;32m两个字符串相等! \e[0m"
else
echo -e "\e[1;5;31m两个字符串不相等! \e[0m"
fi
(3)比较多个字符串时,表达式需要放在[[]]里。
#需要比较多个字符串时,使用[]会报错 如下图
if [ "$s1" == "test1" && "$s2" == "test1" ]
then
echo -e "\e[1;5;32m两个字符串相等! \e[0m"
else
echo -e "\e[1;5;31m两个字符串不相等! \e[0m"
fi
#输出“两个字符串相等!”
if [[ "$s1" == "test1" && $s2 == "test1" ]]
then
echo -e "\e[1;5;32m两个字符串相等! \e[0m"
else
echo -e "\e[1;5;31m两个字符串不相等! \e[0m"
fi
关于写法的注意事项:
在写条件语句比较字符串时一定要注意空格问题。if后、左中括号右边、右中括号左边必须有空格。否则会报如下错误:
另外==两边也要有空格,如果==两边都没有空格,不会提示错误,但无论表达式是否成立,输出结果始终为真,很可能会成为程序的bug,需要格外留意,这也是之前踩过的坑。
二、字符串非空判断
- -z 判断字符串是否为空串,如果是,则条件成立。
- -n 判断字符串是否为空串,如果不是空串(长度大于0),则条件成立
#判断字符串是否为空
if [ -z $s1 ]
then
echo -e "字符串为空!"
else
echo -e "字符串不为空! "
fi
#判断字符串是否不为空(长度大于0)
if [ -n $s1 ]
then
echo -e "字符串长度大于0!"
else
echo -e "字符串为空! "
fi
输出如下:
使用-n进行非空判断时需要注意,如果表达式的变量没有用双引号引起来,且该变量为空串或者未定义,会判断该变量不为空,造成错误。
#未定义的变量 不使用双引号时,-n判断会返回错误结果
if [ -n $ns ]
then
echo -e "字符串长度大于0!"
else
echo -e "字符串为空! "
fi
#空串 不使用双引号时,-n判断会返回错误结果
ns=""
if [ -n $ns ]
then
echo -e "字符串长度大于0!"
else
echo -e "字符串为空! "
fi
返回错误结果:
这是因为如果该变量为空时,相当于执行了如下代码:
#相当于判断空格是否为空值
if [ -n ]
then
echo -e "字符串长度大于0!"
else
echo -e "字符串为空! "
fi
相当于判断一个空格是否为空值,而空格是不为空值的,会判断非空。
所以使用-n进行非空判断时一定要用双引号将变量引起来,如下:
#-n判断的正确打开方式
if [ -n "$ns" ]
then
echo -e "字符串长度大于0!"
else
echo -e "字符串为空! "
fi