shell 判断字符串相等_编程小短文:Bash子字符串还在用==?试试=~性能瞬间飙升100倍...
引言
Bash 是 Linux 系统下钦定的 shell。你可以通过
cat /etc/shells
查看当前系统支持的 shell 种类。
Bash 不但是系统管理员与内核交互的利器,且是一种语言,可以编写大多数系统的自动化脚本,用于简化运维工作。
今天我们学习一个知识点:如何在 Bash 中判断某个字符串中,是否包含子字符串?
![](/assets/blank.gif)
题外话
在高级编程语言中,一般都提供了该功能,比如 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倍...相关推荐
- 大多数日志文件的后缀名是_编程小短文:find,让你随心所欲查找整块磁盘的任意文件...
引言 我们都知道Linux操作系统,一般没有标配桌面窗口.使用 Bash 与操作系统对话.同时,Linux 操作系统,秉持了UNIX操作系统的"一切皆文件"的哲学思想,把各种类型的 ...
- 提升手机麦克风音量_手机音量太小?赶快打开手机这个音量设置,声音瞬间扩大一倍!...
原标题:手机音量太小?赶快打开手机这个音量设置,声音瞬间扩大一倍! 我们在使用手机的时候,会因为在不同场合,适当的调整手机听筒音量,是自己能够听到电话内容而不会影响他人,但是最近,很多朋友表示,自己手 ...
- PHP | 检查字符串中是否存在特定的单词/子字符串
Given a string and a word/substring, and we have to check whether a given word/substring exists in t ...
- qt判断读入的字符串是否含有英文_459. 重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000.示例 1:输入: "abab"输出: True解释: 可由 ...
- 字符串删除首尾_[LeetCode] 459. 重复的子字符串
题目链接: https://leetcode-cn.com/problems/repeated-substring-pattern 难度:简单 通过率:42.6% 题目描述: 给定一个非空的字符串,判 ...
- 【编程题目】对称子字符串的最大长度 ★
73.对称字符串的最大长度(字符串). 题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度. 比如输入字符串"google",由于该字符串里最长的对称子字符串是" ...
- java 字符串赋值_灵魂拷问:为什么 Java 字符串是不可变的?
在逛 programcreek 的时候,发现了一些精妙绝伦的主题.比如说:为什么 Java 字符串是不可变的?像这类灵魂拷问的主题,非常值得深思.对于绝大多数的初级程序员来说,往往停留在"知 ...
- ffmpeg libx264_编程小短文:FFmpeg视频画面尺寸调整,必知必会
引言 FFmpeg是音视频处理领域,应用范围最广的一个项目. 我们日常使用的大小桌面版视频播放器,或者命令行使用的播放器,大多数是基于 ffmpeg 开发的. 如果说它是音视频编解码处理中的老大哥,这 ...
- 编程判断元素归类_编程练习-判断是否为易混淆数
题目来源:LeetCode 给定一个数字 N,当它满足以下条件的时候返回 true: 把原数字旋转180°以后得到新的数字. 如 0, 1, 6, 8, 9 旋转 180° 以后,得到了新的数字 0, ...
最新文章
- 图解Spring解决循环依赖
- 机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler)
- tf.reshape 和 tf.transpose 用法
- 获取其他线程的数据用 queue, 多进程Q
- 云上虚拟IDC(私有池)如何为客户业务的确定性、连续性保驾护航
- connect.js源码解析
- 关于物联网规则引擎技术,你想要知道的都在这儿!
- 图书管理系统python代码课程设计报告_python代码实现图书管理系统
- selinux-setroubleshoot安装及详解
- 如何在对话框程序中让对话框捕获WM_KEYDOWN消息
- 求两个整数最大公约数
- 各种开源数据库同步工具汇总
- Android icon图标网站
- IOS调用微信扫一扫scanQRCode报错the permission value is offline verifying
- outlook设置263邮件服务器,Outlook 2010中263邮箱客户端设置
- 小米怎么卸载html,小米11内容中心有什么用?怎么关闭和卸载呢
- 再见2022,你好2023
- 剧本杀APP发展如何——“我是谜”竞品分析
- 天津铸源宝利缘系统成立仪式在津召开
- iOS9.3.5越狱图文教程