1.字符串声明
一般字符串声明时,都会赋值
str='test'
但是在脚本运行中,为了避免出现引用为声明的字符串变量时,可以在如下处理:
#如果str没声明,则输出DEFAULT
echo "${str=DEFAULT}"
#DEFAULT
2.字符串长度
str=‘abc,def,ghi,abcjkl’
#字符串长度
echo ${#str}
3.字符串截取
从位置position开始截取字符串
格式: ${str:position}
#从第5个元素开始截取
echo ${str:5}
#ef,ghi,abcjkl
从start开始,截取长度为length的字符串
格式:${str:start:length}
echo ${str:5:8}
#ef,ghi,a
从str开头开始删除substring匹配
格式:${str#substring}或${str##substring}
str="abc,def,ghi,abcjkl"
#从str开头开始删除最短的a*c匹配
echo ${str#a*c}
#,def,ghi,abcjkl
#从str开头开始删除最长的a*c匹配
echo ${str##a*c}
#jkl
从str结尾开始删除substring匹配
格式:${str%substring}或${str%%substring}
#从str结尾开始删除最短的b*l匹配
echo ${str%b*l}
#abc,def,ghi,a
#从str结尾开始删除最长的b*l匹配
echo ${str%%b*l}
#a
4.字符串替换
用replace替换字符串中第一个substring格式:${str/substring/replace}或者${str//substring/replace}
#用TEST替换字符串中第一个abc
echo ${str/abc/TEST}
#TEST,def,ghi,abcjkl
#用TEST替换字符串中所有的abc
echo ${str//abc/TEST}
#TEST,def,ghi,TESTjkl
#从str开头匹配,用TEST替换最长的a*c
echo ${str/#a*c/TEST}
#TESTjkl
#从str结尾匹配,用TEST替换最长的b*l
echo ${str/%b*l/TEST}
#aTEST
5.expr操作字符串
对于上面的一些操作,如果改用expr执行,那么就很简单了:str='2016-01-05'
#求字符串长度
length=`expr length $str`
echo $length
#10
#截取字符串
substr=`expr substr $str 1 4`
echo $substr
#2016
#求字符串中元素的下标索引,如果元素不存在输出0(因为此时索引从1开始)
index=`expr index $str "2"`
echo $index
#1
6.split字符串
一般截取字符串还可以用cut和awk,如:str='2016-01-05'
echo $str | awk -F '-' '{print $1}'
echo $str|awk '{print substr($str,1,4)}'
echo $str | awk -F '-' '{for( i=1;i<=NF; i++ ) print $i}'
#2016
#2016
#2016
#01
#05
但是,不建议采用这种方式,因为当文件很大,有很多行,上述方式需要开辟管道,会启动新进程,效率很低下。同时,如果要把awk结果存在数组时,就还需要一个for循环才行。
因此,建议采用下面这种方式:
arr=(${str//-/ })
echo ${arr[1]}
#01
Shell字符串操作、Shell数组熟悉之后就可以用Shell进行小文件处理。