在本文中,将演示如何在bash shell脚本中拆分字符串。
在某些情况下,可能需要拆分字符串数据以执行某些特定任务。大多数编程语言都包含内置功能“split”,可将任何字符串数据分为多个部分。但是,bash不包含此类内置函数。但是可以使用定界符在bash脚本中拆分任何字符串数据。分隔符可以是单个字符,也可以是包含多个字符的字符串。
查看以下方法,了解如何在bash shell中分割字符串:
1. 使用$IFS变量分割
以下是使用$IFS
在bash中拆分字符串的步骤:
$IFS
是一个特殊的内部变量,用于将字符串拆分为单词。$IFS
变量称为“内部字段分隔符”,它确定Bash如何识别边界。$IFS
用于分配分隔字符串的特定定界符[IFS ='']
。空格是$IFS
的默认值。但是,也可以使用\t
,\n
,-
等值作为分隔符。- 分配定界符后,可以通过两个选项读取字符串:
-r
和-a
。即,read -ra ARR <<< "$str"
。在这里,选项-r
用于定义反斜杠(\
),它是字符而不是转义字符。-a
选项用于定义将单词(用$IFS
分隔)分配给从零开始的数组顺序索引。 - 然后,应用bash
for
循环来访问令牌,这些令牌被拆分为一个数组。
下面通过一些示例来了解这种机制:
示例1:Bash按空格分割字符串
在此示例中,使用空格字符定界符分割字符串。
Bash脚本文件:split-demo1.sh
#!/bin/bash
#Example for bash split string by space
read -p "Enter any string separated by space: " str #reading string value
IFS=' ' #setting space as delimiter
read -ra ADDR <<<"$str" #reading str as an array as tokens separated by IFS
for i in "${ADDR[@]}"; #accessing each element of array
do
echo "$i"
done
如果输入字符串"welcome to yiibai!"
,则输出如下所示:
示例2:Bash按符号分割字符串
在某些情况下,可能需要用其他定界符(例如符号或特定字符)来分割字符串。在本示例中,使用逗号(,
)符号字符作为分隔符来分割字符串。
Bash脚本代码:
#!/bin/bash
#Example for bash split string by Symbol (comma)
read -p "Enter Name, City and Age separated by a comma: " entry #reading string value
IFS=',' #setting comma as delimiter
read -a strarr <<<"$entry" #reading str as an array as tokens separated by IFS
echo "Name : ${strarr[0]} "
echo "City : ${strarr[1]} "
echo "Age : ${strarr[2]}"
执行上面示例代码,得到以下结果:
2. 不使用$IFS变量分割
在bash中,也可以在不使用$IFS
变量的情况下分割字符串。使用readarray
命令带-d
选项来拆分字符串数据。-d
选项适用于在命令中定义分隔符,例如$IFS
。此外,bash循环用于以拆分形式打印字符串。
下面通过一些示例来了解此逻辑:
示例1:Bash按符号分割字符串
本示例演示如何在不使用$IFS
的情况下拆分字符串值。使用冒号(:
)输入文本值,以便将其拆分。阅读下面的bash脚本代码:
#!/bin/bash
#Example for bash split string without $IFS
read -p "Enter any string separated by colon(:) " str #reading string value
readarray -d : -t strarr <<<"$str" #split a string based on the delimiter ':'
printf "\n"
#Print each value of Array with the help of loop
for (( n=0; n < ${#strarr[*]}; n++ ))
do
echo "${strarr[n]}"
done
执行上面示例代码,得到以下结果:
示例2:使用字符串拆分字符串
在此示例中,将使用惯用表达式 - 参数扩展。
Bash脚本代码
#!/bin/bash
#Example for bash split string by another string
str="WeLearnWelcomeLearnYouLearnOnLearnYiibai"
delimiter=Learn
s=$str$delimiter
array=();
while [[ $s ]];
do
array+=( "${s%%"$delimiter"*}" );
s=${s#*"$delimiter"};
done;
declare -p array
在此bash脚本中,使用了以下参数扩展:
${s%%"$delimiter"*}
- 它删除最长的匹配后缀模式。${s#*"$delimiter"}
- 它删除最短的匹配前缀模式。
执行上面示例代码,得到以下结果:
maxsu@yiibai:~/bashcode$ vi split-bash.sh
maxsu@yiibai:~/bashcode$ chmod u+x split-bash.sh
maxsu@yiibai:~/bashcode$ ./split-bash.sh
declare -a array=([0]="We" [1]="Welcome" [2]="You" [3]="On" [4]="Yiibai")
示例3:使用Trim命令分割字符串
在此示例中,我们使用trim(tr)命令分割字符串。trim命令不是使用read命令,而是用于在定界符上拆分字符串。
Bash脚本代码
#!/bin/bash
#Example to split a string using trim (tr) command
my_str="We;welcome;you;on;yiibai!"
my_arr=($(echo $my_str | tr ";" "\n"))
for i in "${my_arr[@]}"
do
echo $i
done
执行上面示例代码,得到以下结果: