在本文中,将演示如何在bash shell脚本中拆分字符串。
在某些情况下,可能需要拆分字符串数据以执行某些特定任务。大多数编程语言都包含内置功能“split”,可将任何字符串数据分为多个部分。但是,bash不包含此类内置函数。但是可以使用定界符在bash脚本中拆分任何字符串数据。分隔符可以是单个字符,也可以是包含多个字符的字符串。
查看以下方法,了解如何在bash shell中分割字符串:
以下是使用$IFS
在bash中拆分字符串的步骤:
$IFS
是一个特殊的内部变量,用于将字符串拆分为单词。$IFS
变量称为“内部字段分隔符”,它确定Bash如何识别边界。$IFS
用于分配分隔字符串的特定定界符[IFS ='']
。空格是$IFS
的默认值。但是,也可以使用\t
,\n
,-
等值作为分隔符。-r
和-a
。即,read -ra ARR <<< "$str"
。在这里,选项-r
用于定义反斜杠(\
),它是字符而不是转义字符。-a
选项用于定义将单词(用$IFS
分隔)分配给从零开始的数组顺序索引。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 zyiz!"
,则输出如下所示:
示例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]}"
执行上面示例代码,得到以下结果:
在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="WeLearnWelcomeLearnYouLearnOnLearnzyiz" 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@zyiz:~/bashcode$ vi split-bash.sh maxsu@zyiz:~/bashcode$ chmod u+x split-bash.sh maxsu@zyiz:~/bashcode$ ./split-bash.sh declare -a array=([0]="We" [1]="Welcome" [2]="You" [3]="On" [4]="zyiz")
示例3:使用Trim命令分割字符串
在此示例中,我们使用trim(tr)命令分割字符串。trim命令不是使用read命令,而是用于在定界符上拆分字符串。
Bash脚本代码
#!/bin/bash #Example to split a string using trim (tr) command my_str="We;welcome;you;on;zyiz!" my_arr=($(echo $my_str | tr ";" "\n")) for i in "${my_arr[@]}" do echo $i done
执行上面示例代码,得到以下结果: