Split String with Shell Script

Method One: 利用shell中变量的字符串替换

原理:
${parameter//pattern/string}
这个操作可以将parameter中的pattern替换成string
示例:

1
2
3
4
5
6
7
original=just_do_it.cpp
original=${original%.cpp} # get rid of suffix
split=${original//_/ }
for i in ${split[@]}
do
echo ${i}
done

补充:
回顾一下\${}字符串处理的其他用法:

1
2
3
4
5
6
7
8
9
10
11
${#string} #计算长度  
${string:position} #从position位置开始提取字符串
${string:position:length} #从position位置开始提取长度为length的字符串
${string#substring} #从左到右切除符合substring的最小子串,substring可以为正则表达式
${string##substring} #从左到右切除符合substring的最大子串
${string%substring} #从右到左切除符合substring的最小子串
${string%%substring} #从右到左切除符合substring的最大子串
${string/pattern/string} #替换第一个匹配的pattern
${string/#pattern/string} #从左到右替换第一个匹配的pattern
${string/%pattern/string} #从右到左替换第一个匹配的pattern
${string//pattern/string} #替换所有匹配的pattern

Method Two: 通过IFS变量设置分隔符

Shell脚本中有个变量叫IFS(Internal Field Seprator,内部域分隔符)
Shell的环境变量分为set和env两种,set变量可以通过export倒入到env变量中。set是显示设置的shell变量,仅在本shell中有效,env变量的作用域要大一些,是用户变量,用户变量在不同的shell中都是一样的。IFS是一种set变量,当shell处理“命令替换”和参数替换时,shell根据IFS的值,默认是space,tab,newline来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。(如果变量的外面有双引号的话,则不会将space tab newline当作分隔符)
示例:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
a=he_li_wei_long_wei.cpp
OLD_IFS=${IFS}
IFS="_"
array=($a)
IFS=$OLD_IFS

for i in ${array[@]}
do
echo $i
done

补充:
set变量,env变量及export的使用实例:

1
2
3
4
5
6
7
8
9
10
$ a=b #设置shell变量  
$ echo $a
b
env | grep a # 用户变量中并没有a
set | grep a # shell变量中有a
a=b
export | grep a # 导出变量中也没有
export a
env | grep a # 使用export导出之后用户变量存在了
a=b

Method Three: 使用tr命令实现字符替换

这个方法与第一种方法类似,作用是将原分隔符替换成系统默认的IFS分隔符中的空格。
使用示例:

1
2
3
4
5
6
7
8
#!/bin/bash
a=he_li_wei_long_wei.cpp
a=${a%.cpp}
arr=`echo $a | tr '_' ' '`
for i in ${arr[@]}
do
echo $i
done