首页 > 系统相关 >【Shell】判断是否包含给定字符串【转】

【Shell】判断是否包含给定字符串【转】

时间:2023-02-21 16:56:14浏览次数:33  
标签:Shell 匹配 包含 str2 str1 echo 给定 字符串

Shell判断字符串包含关系的几种方法
Shell中判断字符串包含关系的方法:

1、通过grep来判断:

str1="abcdefgh"
str2="def"
result=$(echo $str1 | grep "${str2}")
if [[ "$result" != "" ]]
then
echo "包含"
else
echo "不包含"
fi

先打印长字符串,然后在长字符串中 grep 查找要搜索的字符串,用变量result记录结果,如果结果不为空,说明str1包含str2。如果结果为空,说明不包含。这个方法充分利用了grep 的特性,最为简洁。

 

 

2、字符串运算符

str1="abcdefgh"
str2="def"
if [[ $str1 =~ $str2 ]]
then
echo "包含"
else
echo "不包含"
fi
利用字符串运算符 =~ 直接判断str1是否包含str2。

 


3、利用通配符

str1="abcdefgh"
str2="def"
if [[ $str1 == *$str2* ]]
then
echo "包含"
else
echo "不包含"
fi
用通配符*号代理str1中非str2的部分,如果结果相等说明包含,反之不包含。

 

 

4、利用case in 语句

str1="abcdefgh"
str2="def"
case $str1 in
*"$str2"*) echo Enemy Spot ;;
*) echo nope ;;
esa

 


5、利用替换

str1="abcdefgh"
str2="def"
if [[ ${str1/${str2}//} == $str1 ]]
then
echo "不包含"
else
echo "包含"
fi

 


注意下文中的用的是[[]]还是[]

Shell判断文件是否包含给定字符串

给定一个字符,比方说“Hello Linduo”,查找相应文件中是否包含该字符。
方式1:grep

# grep -c 返回 file中,与str匹配的行数
grep -c str file

FIND_FILE="/home/linduo/test/Test.txt"
FIND_STR="Hello Linduo"
# 判断匹配函数,匹配函数不为0,则包含给定字符
if [ `grep -c "$FIND_STR" $FIND_FILE` -ne '0' ];then
echo "The File Has Hello Linduo!"
exit 0
fi

 

方式2:cat、while、read组合使用。使用这种方式,要注意时while read 在子shell中运行。

FIND_FILE="/home/linduo/test/Test.txt"
FIND_STR="Hello Linduo"
cat $FIND_FILE| while read line
do
if [[ $line =~ $FIND_STR ]];then
echo "The File Has Hello Linduo!"
fi
done

 

原文:【Shell】判断文件是否包含给定字符串_林多的博客-CSDN博客_shell判断文件内容是否包含

shell中[ ]和[[]]的区别

探索shell中[ ]和[[]]的区别_程序猿编码的博客-CSDN博客

多数情况下[ ]和[[]]是可以通用的,单中括号 [ ],bash 的内部命令,[和test是等同的。双中括号[[ ]],[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。

[ ] 和 [[]]区别

[ ]中可用的比较运算符只有==和!=,可用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。

[[ ]] 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ minger == ming? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

实例

上面说了这么多概念性的区别,不能清晰描述 [ ] 与 [[ ]] 的区别,不如我们先来看一些应用场景,根据应用场景,反而更容易理解一些。


(这里一定要注意空格的问题,空格不可或缺)

在[[ ]]中使用< 和 >符号时,系统进行的排序操作,而且支持在测试表达式内使用&&和||符号。在test和[ ]测试语句中不可以使用&& 、||符号。

在ASCll码的顺序中,小写字母顺序码 > 大写字母顺序码 > 数字顺序码。在使用ASCll中,可以使用LANG=C设置在排序时使用标准的ASCll码顺序。

验证了,小写字母顺序码大于大写字母顺序码。

验证了,大写字母顺序码大于数字顺序码。

上面的截屏,大写字母顺序码不能大于小写字母顺序码。

虽然[ ]支持同时进行时多个条件的逻辑测试,但是在[ ]中需要使用-a 和 -o进行逻辑与和逻辑或的比较操作,而[[ ]]中可以直接使用&&和||进行逻辑比较操作,更直观,可读性更好。

需要注意的还有 == 比较符,在 [[]]中==是模式匹配,模式匹配允许使用通配符,例如:Bash常用的通配符有*、?、[…]等,而 ==在test语句中仅代表字符串的精准比较,判断字符串是否一模一样。

我们可以写个例子,测试变量name的值是否已字母J开头,后面可以是任意长度字符,测试结果为真。

接着,测试变量name的值是否以字母A开头,后面可以是任意长度的任意字符,测试结果为假。

测试变量name的值是否m和nger中间有任意的单子字符?

我们下面测试字符a,是否是小写字母?

测试字符a,是否是数字?

下面使用[ ]对 == 进行比较操作,但在[]中系统进行的是字符串的比较操作,判断两个字符串是否绝对相同。

另外,在[[]]中还支持使用=~进行正则匹配,而在[]中则完全不支持正则匹配。

上面的截屏,对变量name的值进行正则匹配,判断name的值是否包含字母w。

下面我们判断name的值是否包含数字。

对name的值是否包含小写字母。

最后,我们列出[[]] 和 [] 的差异汇总信息,相同点这里不再赘述。为了熟练掌握这些语法。

[[]]测试 []测试
< 排序比较 不支持
> 排序比较 不支持
&& 逻辑与 -a 逻辑与
== 模式匹配 ==字符匹配
=~正则匹配 不支持

原文链接:https://blog.csdn.net/chen1415886044/article/details/109018993

 

格式匹配

shell中 =~ 与 == 的区别:

[[7.6 =~ 7.6.* ]]
echo $?
#输出0
[[7.6 == 7.6.* ]]
echo $?
#输出1
[[7.6 =~ 7.6 ]]
echo $?
#输出0
[[7.6 == 7.6 ]]
echo $?
#输出0

#输出0:error为0
#输出1:error为1

 

之前对shell的学习只停留在理论,很多点都是一扫而过,没有思考其他的可能性,这样会错过很多的知识。接下来分享的是=~的用法。

问题描述
在看脚本的时候发现了$version =~ $new_version,其中=~不熟悉,于是就去搜索了一下:

正则匹配,用来判断其左侧的参数是否符合右边的要求,如果匹配则为真,不匹配则为假。如果匹配就输出1,不匹配就输出0(描述存在歧义) 。
于是产生了=~与==的联想,开始了实践,获得了一些结果:

 

(echo $?为返回上一行命令输出)

结论:
=~支持正则表达式,同时支持变量比较相等。==只能支持比较变量相不相等。

可知:如果需要做两个变量的包含关系,可以使用=~匹配

转自

(43条消息) 【Shell】判断是否包含给定字符串_bandaoyu的博客-CSDN博客_shell判断字符串包含某个字符串
https://blog.csdn.net/bandaoyu/article/details/115484153

标签:Shell,匹配,包含,str2,str1,echo,给定,字符串
From: https://www.cnblogs.com/paul8339/p/17141581.html

相关文章

  • 关于压缩后字符串写入clickhouse再读取后无法反解压的问题
    我们将一个长字符串进行了压缩,采用zstd或者snappy之类的,将字符串压成了byte[],然后将byte[]作为一个属性写入了clickhouse数据库,clickhouse会默认将byte[]转为String进行存储......
  • JavaScript 中字符串和数组的截取办法总结
    字符串substring形式:substring(index1,index2)不会改变原始字符串将小的参数作为开始位置start,大的作为结束位置stop包含start,但不包含stop如果只给一个参数表......
  • 兼容oracle的edit_distance_similarity 比较两个字符串相似度
    瀚高数据库目录环境症状问题原因解决方案报错编码环境系统平台:Linuxx86RedHatEnterpriseLinux6版本:4.5.7症状在进行应用适配过程中会遇到用户使用oracle的SYS.UTL_MAT......
  • 数据类型----字符串内置方法
    一、定义#定义:在单引号\双引号\三引号内包含一串字符name1='jason' #本质:name=str('任意形式内容')name2="lili" #本质:name=str("任意......
  • 在shell脚本中切换工作目录(切换路径)
    1、拿到1个shell脚本,如何通过脚本获取脚本当前所在的路径呢?2、拿到1个脚本如何让别人在任意的目录双击执行呢?(非命令行执行脚本的形式)3、在银河麒麟系统测试成功,其他平台......
  • 工程监测多通道振弦模拟信号采集仪VTN的$字符串通讯协议
    工程监测多通道振弦模拟信号采集仪VTN的$字符串通讯协议 VTN208-432是多通道振弦、温度、模拟传感信号系列数据采集仪,可对32通道振弦频率、32通道热敏电阻或DS18B20温......
  • Python字符串操作
    1.字符串索引例:data='abcd'print(data[3])运行结果:d0123正索引-4-3-2-1负索引2.字符串切片data[:]中括号中冒号的左边是第一刀右边是第二刀例:data='......
  • endsWith 判断字符串是否以某字符结尾的
    在上面的例子中,endsWith方法被用来检查字符串str是否以感叹号结尾,并将结果赋值给变量endsWithExclamation。由于str确实以感叹号结尾,因此endsWithExclamation的......
  • shell脚本解析参数
    shell脚本参数解析手动解析$0#文件名$1#第一个参数$2#第二个参数$*#所有参数的字符串$@#所有参数的数组getoptsgetopts不支持长参数(例如:长:--help;短:-h)......
  • 无法使用xshell连接linux虚拟机
    问题:  解决:我们需要启动sshd远程连接 命令:/etc/init.d/sshdstart   现在就没有问题了!!!......