shell中字符串的比较与判断总结

接触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

 

Shell脚本判断一个字符串是否包含子字符串有多种方法可以实现。其,可以使用if语句结合字符串的匹配操作符来判断,也可以使用grep命令进行匹配。 方法1: 使用if语句结合字符串的匹配操作符: ``` if [[ ${str} == *${subStr}* ]] ;then echo -e "String '${str}' contains substring: '${subStr}'." else echo -e "String '${str}' does not contain substring: '${subStr}'." fi ``` 这种方法使用双方括号[[ ]]来进行判断,通过在字符串使用*来表示任意字符。如果字符串str包含了子字符串subStr,则执行if后面的语句块,否则执行else后面的语句块。 方法2: 使用grep命令进行匹配: ``` if echo ${str} | grep ${subStr} ;then echo -e "String '${str}' contains substring: '${subStr}'." else echo -e "String '${str}' does not contain substring: '${subStr}'." fi ``` 这种方法使用了管道符号|将字符串str传递给grep命令进行匹配。如果grep命令返回了匹配结果,则执行if后面的语句块,否则执行else后面的语句块。 以上是两种常见的在Shell脚本判断字符串是否包含子字符串的方法,根据具体需求可以选择适合的方法来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python字符串比较使用is、==和cmp()总结](https://download.csdn.net/download/weixin_38722052/13778345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [[shell] 判断字符串是否包含子字符串方法([[ 、=~、##、%%)](https://blog.csdn.net/lm_hao/article/details/126856298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值