引言

Bash 是 Linux 系统下钦定的 shell。你可以通过

cat /etc/shells

查看当前系统支持的 shell 种类。

Bash 不但是系统管理员与内核交互的利器,且是一种语言,可以编写大多数系统的自动化脚本,用于简化运维工作。

今天我们学习一个知识点:如何在 Bash 中判断某个字符串中,是否包含子字符串?

题外话

在高级编程语言中,一般都提供了该功能,比如 PHP 使用函数 strpos 查找子字符串首次出现的位置,有则返回 integer 整型,没有则返回 false。

strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int

在 MySQL 中也经常使用字符串匹配,比如通配符 %,还可以使用函数 instr 来实现。

SELECT INSTR("abcd",'f');

问题的提出

一位开发者在编写 Bash 脚本的过程中,遇到一个问题。首先是有这样一个赋值操作:

string="My string"

然后他判断是否存在某个子字符串:

if [ $string ?? 'foo' ]; then  echo "It's there!"fi

他这里打的 ?? 是占位符号,不知道该怎么写。甚至有了一种丑陋的写法:

if echo "$string" | grep 'foo'; then  echo "It's there!"fi

这样的实现是不是 low 太多了?

解决方法

能用一行解决的问题,何必 BB!

一位开发者给出的方案是,如果判断条件上使用了双中括号,那么就可以这样写:

string='My long string'if [[ $string == *"My long"* ]]; then  echo "It's there!"fi

注意,是将子字符串外部使用双*号包裹。

其中 == 是字符串相等的比较符。而 * 则是通配符,会适配任意长度的任意字符。

强大的正则

我们知道,Bash 中的数据类型是极为弱的,不像高级语言那样区分 integer, string, float, double, array, Object 等等。在 Bash 看来,万物都是字符串。这与 Unix 的“一切皆文件”哲学不谋而合。

处理字符串,我们必然绕不开“正则表达式”。

上述的问题,有没有可能使用强大的正则方式处理呢?答案是肯定的。

比如这样写:

string='My string';if [[ $string =~ "My" ]]then   echo "It's there!"fi

注意我们使用了 =~ 用于正则匹配,而不是逻辑运算符了。

正如上面所述,Bash 中如果是数字的比较,也完全可以使用字符串的正则方式处理。

比如要判断某个整数值,是否在某个有效的列表内。可以这样写。

number=3if [[ "1,3,5,6,9" =~ "${number}" ]]; then    echo "Yes"fi

用起来是不是精简多了。

知识延伸

像问题中使用 grep 用于子字符串筛选的那样,其实有更稳固的写法:

if grep -q foo <<

一般不使用 echo 后使用管道符 grep。

写在最后

在命令行中敲一下测试测试吧。只有多实践才能加深印象。

另外,正则表达式是真的强!

Happy coding :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

shell 判断字符串相等_编程小短文:Bash子字符串还在用==?试试=~性能瞬间飙升100倍...相关推荐

  1. 大多数日志文件的后缀名是_编程小短文:find,让你随心所欲查找整块磁盘的任意文件...

    引言 我们都知道Linux操作系统,一般没有标配桌面窗口.使用 Bash 与操作系统对话.同时,Linux 操作系统,秉持了UNIX操作系统的"一切皆文件"的哲学思想,把各种类型的 ...

  2. 提升手机麦克风音量_手机音量太小?赶快打开手机这个音量设置,声音瞬间扩大一倍!...

    原标题:手机音量太小?赶快打开手机这个音量设置,声音瞬间扩大一倍! 我们在使用手机的时候,会因为在不同场合,适当的调整手机听筒音量,是自己能够听到电话内容而不会影响他人,但是最近,很多朋友表示,自己手 ...

  3. PHP | 检查字符串中是否存在特定的单词/子字符串

    Given a string and a word/substring, and we have to check whether a given word/substring exists in t ...

  4. qt判断读入的字符串是否含有英文_459. 重复的子字符串

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000.示例 1:输入: "abab"输出: True解释: 可由 ...

  5. 字符串删除首尾_[LeetCode] 459. 重复的子字符串

    题目链接: https://leetcode-cn.com/problems/repeated-substring-pattern 难度:简单 通过率:42.6% 题目描述: 给定一个非空的字符串,判 ...

  6. 【编程题目】对称子字符串的最大长度 ★

    73.对称字符串的最大长度(字符串). 题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度. 比如输入字符串"google",由于该字符串里最长的对称子字符串是" ...

  7. java 字符串赋值_灵魂拷问:为什么 Java 字符串是不可变的?

    在逛 programcreek 的时候,发现了一些精妙绝伦的主题.比如说:为什么 Java 字符串是不可变的?像这类灵魂拷问的主题,非常值得深思.对于绝大多数的初级程序员来说,往往停留在"知 ...

  8. ffmpeg libx264_编程小短文:FFmpeg视频画面尺寸调整,必知必会

    引言 FFmpeg是音视频处理领域,应用范围最广的一个项目. 我们日常使用的大小桌面版视频播放器,或者命令行使用的播放器,大多数是基于 ffmpeg 开发的. 如果说它是音视频编解码处理中的老大哥,这 ...

  9. 编程判断元素归类_编程练习-判断是否为易混淆数

    题目来源:LeetCode 给定一个数字 N,当它满足以下条件的时候返回 true: 把原数字旋转180°以后得到新的数字. 如 0, 1, 6, 8, 9 旋转 180° 以后,得到了新的数字 0, ...

最新文章

  1. 图解Spring解决循环依赖
  2. 机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler)
  3. tf.reshape 和 tf.transpose 用法
  4. 获取其他线程的数据用 queue, 多进程Q
  5. 云上虚拟IDC(私有池)如何为客户业务的确定性、连续性保驾护航
  6. connect.js源码解析
  7. 关于物联网规则引擎技术,你想要知道的都在这儿!
  8. 图书管理系统python代码课程设计报告_python代码实现图书管理系统
  9. selinux-setroubleshoot安装及详解
  10. 如何在对话框程序中让对话框捕获WM_KEYDOWN消息
  11. 求两个整数最大公约数
  12. 各种开源数据库同步工具汇总
  13. Android icon图标网站
  14. IOS调用微信扫一扫scanQRCode报错the permission value is offline verifying
  15. outlook设置263邮件服务器,Outlook 2010中263邮箱客户端设置
  16. 小米怎么卸载html,小米11内容中心有什么用?怎么关闭和卸载呢
  17. 再见2022,你好2023
  18. 剧本杀APP发展如何——“我是谜”竞品分析
  19. 天津铸源宝利缘系统成立仪式在津召开
  20. iOS9.3.5越狱图文教程

热门文章

  1. php下的原生ajax请求
  2. iOS中的WiFi与硬件通信
  3. URAL 1146 Maximum Sum(最大子矩阵的和 DP)
  4. 不是世界不好,而是你见得太少
  5. WCF全双工以及用户名密码验证
  6. Spring Cloud 微服务架构
  7. koa --- [MVC实现之五]Model层的实现
  8. 2 中间件的使用、异步action的创建
  9. Java编写基于netty的RPC框架
  10. 搭建一个基于http的yum服务器