BASH shell脚本篇3——字符串处理

这篇文章介绍下BASH shell中的字符串处理的相关命令。之前有介绍过shell的其它命令,请参考:

BASH shell脚本篇1------基本命令

BASH shell脚本篇2------条件命令

Bash字符串也是一种数据类型,它用于表示文本而不是数字,它是一组可能还包含数字的字符的组合。如果数字想要表示为字符串,那么需要程序员用引号将数字包起来,以便Bash将数据视为字符串。BASH对字符串的操作有很多方式,以下记录了其中一些常用的用法。

1.字符串基本操作

字符串比较的命令有:

bash 复制代码
# 等于运算符:用于检查两个字符串是否相等
语法:Operand1 = Operand2
# 不等于运算符:用于检查两个字符串不相等
语法:Operand1 != Operand2
# 小于运算符:是一个条件运算符,用于检查string1是否小于string2
语法:Operand1 \< Operand2
# 大于运算符:用于检查string1是否大于string2
语法:Operand1 \> Operand2
# 检查字符串长度是否大于零
语法:[ -n Operand ]
# 检查字符串长度是否等于零
语法:[ -z Operand ]

2. 字符串长度计算

字符串中的字符总数表示字符串的长度。我们有时需要判断字符串的长度才能执行特定任务。在Bash脚本中,可以使用以下几种方法来获取字符串的长度。

bash 复制代码
# 方法1
${#str}  
# 方法2
expr length "$str"  
# 方法3
expr "$str" :'.*'  
# 方法4
$str | wc -c  
# 方法5
$str | awk '{print length}'
# 注意:请注意在$str周围使用双引号。如果字符串中包含空格,则双引号非常重
#       要。否则,可以忽略它。

例子如下

bash 复制代码
# The script is:
str="str len"
echo "Method1:" ${#str}
length=`expr length "$str"`
echo "Method2:" $length
length=`expr "$str" : '.*'`
echo "Method3:" $length
length=`echo -n $str | wc -c`
echo "Method4:" $length
length=`echo -n $str | awk '{print length}'`
echo "Method5:" $length

# The result is:
Method1: 7
Method2: 7
Method3: 7
Method4: 7
Method5: 7

3. 拆分字符串

有时候需要根据分隔符来拆分字符串数据,bash没有直接的拆解字符串内置函数,但可以使用定界符在bash脚本中拆分字符串数据。分隔符可以是单个字符,也可以是包含多个字符的字符串。

我们可以使用IFS变量来拆分,`IFS是一个特殊的内部变量,用于将字符串拆分为单词。IFS`变量称为"内部字段分隔符",它确定Bash如何识别边界。`IFS用于分配分隔字符串的特定定界符[IFS ='']。空格是IFS`的默认值。但是,也可以使用`\t`,`\n`,`-`等值作为分隔符。分配定界符后,可以通过两个选项读取字符串:`-r`和`-a`。即,`read -ra ARR <<< "str"。在这里,选项-r用于定义反斜杠(`),它是字符而不是转义字符。-a选项用于定义将单词(用$IFS分隔)分配给从零开始的数组顺序索引。然后,应用bash for循环来访问列表,这些列表被拆分为一个数组。

例子如下:

bash 复制代码
# The script is:
str="gabc,23ab,45,abc789abcend, jj kk"
IFS="," #setting "," as delimiter
read -ra array <<<"$str" #reading str as an array as tokens separated by IFS
declare -p array # print array content

# The result is:
declare -a array='([0]="gabc" [1]="23ab" [2]="45" [3]="abc789abcend" [4]=" jj kk")'

拆分字符串还有其它方式,这只是其中一种。

4. 提取子字符串

子字符串是字符串中的字符序列,Bash提供了一个从字符串提取信息的选项,可以使用多种方法提取数字或给定的字符串。字符串提取的语法为:

bash 复制代码
${variable:offset:length}
# 其中:
# - variable是包含字符串的变量名称
# - offset用于指定从何处开始提取字符串的位置,也可以是负的,反向提取
# - length用于指定从偏移量开始执行的字符范围
# 分配长度是可选的。如果未提供length,则子字符串的结尾将是字符串的结尾

例子如下:

bash 复制代码
# The script is:
str="welcome to the world"
echo ${str:0:10}
echo ${str:(-9)}

# The result is:
welcome to
the world

5. 连接字符串

将两个或多个字符串添加或连接在一起,这称为字符串连接。bash中字符串连接的格式为:

bash 复制代码
# 方法1:
str3="$str1$str2"
# 此命令将串联str1和str2变量的值,并将其存储在第三个变量str3中

# 方法2:
newstr="${str} newstr"
# 此命令将字符串变量的值与其它字符串拼接在一起
相关推荐
CoolTiger、37 分钟前
【Vmware16安装教程】
linux·虚拟机·vmware16
学习3人组2 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
厨 神2 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0662 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
geek_Chen012 小时前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
(⊙o⊙)~哦3 小时前
linux 解压缩
linux·运维·服务器
牧小七4 小时前
Linux命令---查看端口是否被占用
linux
鸡鸭扣5 小时前
虚拟机:3、(待更)WSL2安装Ubuntu系统+实现GPU直通
linux·运维·ubuntu
友友马5 小时前
『 Linux 』HTTP(一)
linux·运维·服务器·网络·c++·tcp/ip·http
记得开心一点嘛6 小时前
在Linux系统上使用Docker部署javaweb项目
linux·运维·docker