shell编程之字符串处理
在 shell 中,由于是一种弱类型的语言,在没有事先申明变量类型的情况下,所有的变量都是字符串。所以对字符串的处理就显得相当重要了。
下面介绍常见的对字符串处理的操作。
一、字符串切片
${string_var:offest:length},类似于数组元素的提取。
1
2
3
4
|
# 这里的string_var是一个变量,offest 是字符串的开始偏移量,length是切去字符串的长度 var=dhcpd:x:177:177:DHCP server:/: /sbin/nologin
[root@server ~] # echo ${var:6:3}
x:1 |
${string_var:offest}
1
2
3
|
# 不指定 length 指,默认显示到最后 [root@server ~] # echo ${var:6}
x:177:177:DHCP server:/: /sbin/nologin
|
${string_var: -offest}
1
2
3
|
# 获取尾部起向前指定长度的字符 [root@server ~] # echo ${var: -7}
nologin |
二、获取子串
1、${string_var#*word}
1
2
3
4
|
# 在string_var变量中存储的子串中,自左向右,查找第一次出现word,删除字符开始至此word处的所有内容 var= /etc/sysconfig/network-scripts/sysconfig/etc/cmd
[root@server ~] # echo ${var#*etc}
/sysconfig/network-scripts/sysconfig/etc/cmd |
2、${string_var##*word}
1
2
3
4
5
6
|
# 在string_var变量中存储的子串中,自左向右,查找第一次出现word,删除字符开始至此word处的所有内容 [root@server ~] # echo ${var##*etc}
/cmd ## 通常情况下同这种方法可以取得一个目录的基名 [root@server ~] # echo ${var##*/}
cmd |
3、${variable%word*}
1
2
3
4
|
# 在variable中存储字串上,自右而左,查找第一次出现word,删除此word处至字串尾部的所有内容 var= /etc/sysconfig/network-scripts/sysconfig/etc/cmd
[root@server ~] # echo ${var%etc*}
/etc/sysconfig/network-scripts/sysconfig/ |
4、${variable%%world*}
1
2
3
|
# 在variable中存储字串上,自右而左,查找最后一次出现word,删除此word处至字串尾部的所有内容; [root@server ~] # echo ${var%%etc*}
/ |
三、查找替换
1、${string_var/pattern/new_string}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 在string_var字符串变量中,自左向右,替换第一次被pattern匹配到的子串为new_string var= bash :x:4403:4403:: /home/bash : /bin/bash
[root@server ~] # echo ${var/bash/zsh/}
zsh/:x:4403:4403:: /home/bash : /bin/bash
# 在这里可以使用文件通配符,像 ? * 等 [root@server ~] # echo ${var/b??h/zsh/}
zsh/:x:4403:4403:: /home/bash : /bin/bash
# 使用 # 可以锚定变量值首部 [root@server ~] # echo ${var/%b??h/zsh/}
bash :x:4403:4403:: /home/bash : /bin/zsh/
# 使用 % 可以锚定变量值尾部 [root@server ~] # echo ${var/#b??h/zsh/}
zsh/:x:4403:4403:: /home/bash : /bin/bash
|
2、${string_var//pattern/new_string}
1
2
3
|
# 在string_var字符串变量中,自左向右,替换被pattern匹配到的子串为new_string,匹配到几次就替换几次 [root@server ~] # echo ${var//b??h/zsh/}
zsh/:x:4403:4403:: /home/zsh/ : /bin/zsh/
|
四、查找删除
1
2
|
# 所用的变量如下 var= bash :x:4403:4403:: /home/bash : /bin/bash
|
1、${string_var/pattern}
1
2
3
4
5
6
7
|
# 在string_var字符串变量中,自左向右,替换第一次被pattern匹配到的子串后将其删除 [root@server ~] # echo ${var/b??h/}
:x:4403:4403:: /home/bash : /bin/bash
# 同样可以使用 # 和 % 锚定变量值首部和尾部 [root@server ~] # echo ${var/%b??h/}
bash :x:4403:4403:: /home/bash : /bin/
|
2、${string_var//pattern}
1
2
3
|
# 在string_var字符串变量中,自左向右,替换被pattern匹配到的子串为new_string,匹配到几次就删除几次 [root@server ~] # echo ${var//b??h/}
:x:4403:4403:: /home/ : /bin/
|
五、大小写转换
1、${string_var^^}
1
2
3
4
5
6
7
8
9
|
var=var= bash :x:4403:4403:: /home/bash : /bin/bash
# 将string_var变量中的小写字母全部转换为大写字母 [root@server ~] # echo ${var^^}
BASH:X:4403:4403:: /HOME/BASH : /BIN/BASH
# 也可以指定那个字符替换大写,只支持单个字符 [root@server ~] # echo ${var^^a}
bAsh:x:4403:4403:: /home/bAsh : /bin/bAsh
|
2、${string_var,,}
1
2
3
4
5
6
7
8
|
var1=BASH:X:4403:4403:: /HOME/BASH : /BIN/BASH
# 将string_var变量中的大写字母全部转换为小写字母 [root@server ~] # echo ${var1,,}
bash :x:4403:4403:: /home/bash : /bin/bash
[root@server ~] # echo ${var1,,A}
BaSH:X:4403:4403:: /HOME/BaSH : /BIN/BaSH
|
六、变量复制操作
1、${string_var:-value}
1
2
3
4
5
6
7
8
9
10
11
|
# 如果 string_var 变量没有被set或者变量值为空的话,就将 string_var 变量值设置为 value。 # 但是这个不会改变原来变量的值 [root@server ~] # name=centos
[root@server ~] # echo ${name:-redhat}
centos [root@server ~] # unset name
[root@server ~] # echo ${name:-redhat}
redhat [root@server ~] # name=
[root@server ~] # echo ${name:-redhat}
redhat |
${string_var-value}
1
2
3
4
5
6
7
8
9
10
|
# 如果 string_var 变量没有被set话,就将 string_var 变量值设置为 value。 [root@server ~] # name=
[root@server ~] # echo ${name-redhat}
[root@server ~] # unset name
[root@server ~] # echo ${name-redhat}
redhat # ${string_var:-value} 与 ${string_var-value}的区别如下: # 在变量值为空的时候,${string_var-value} 不会被设定为value的值,还是原来的空值 |
2、${string_var:=value} ${string_var=value}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# ${string_var:=value} 与 ${string_var=value} 如果原来的没有被 set 或者为空 # 就会将 value的值赋值给 string_var变量 # ${string_var:=value} 与 ${string_var=value} 区别如下: [root@server ~] # name=
[root@server ~] # echo ${name=redhat}
[root@server ~] # echo $name
[root@server ~] # name=
[root@server ~] # echo ${name:=redhat}
redhat [root@server ~] # echo $name
redhat # 当原来的变量值为空的话,二者有区别,其他一样,区别如下: # 如果原来的变量值为空的话: # ${name=redhat} 处理时,保持原来变量的空值 # ${name:=redhat} 处理时,会将变量值设置为 redhat |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# ${string_var:=value} 和 ${string_var:-value} 表示意义相同,区别如下: [root@server ~] # unset name
[root@server ~] # echo ${name:-redhat}
redhat [root@server ~] # echo $name
[root@server ~] # echo ${name:=redhat}
redhat [root@server ~] # echo $name
redhat # ${string_var:-value} 不会改变原来变量的值 # ${string_var:=value} 在执行赋值操作后会改变原来变量的值 |
3、${string_var:+value}
1
2
3
4
5
|
# 如果 string_var 变量被set或者变量值不为空的话,就将 string_var 变量值设置为 value。 [root@server ~] # name=centos
[root@server ~] # echo ${name:+redhat}
redhat |
${string_var+value}
1
2
3
4
5
|
# 如果 string_var 变量被set的话,就将 string_var 变量值设置为 value。 [root@server ~] # name=
[root@server ~] # echo ${name+redhat}
redhat |
4、${string_var:?err_msg} ${string_var?err_msg}
1
2
3
4
|
# ${string_var?err_msg}, ${string_var:?err_msg}如果 string_var 被 set,那就是用 set 的值,否则 print err_msg. # 这两种办法绝大多数时候用法都一样,只有在 $string_var 被声明并设置为空的时候,会有区别 # |
1
2
3
4
5
6
|
[root@server ~] # debug=
[root@server ~] # echo ${debug:?err_type1}
- bash : debug: err_type1
[root@server ~] # debug=error1
[root@server ~] # echo ${debug:?err_type1}
error1 |
七、补充
1、${#var_name}
1
2
3
4
|
# 取得var_name变量的长度 [root@server ~] # name="boy"
[root@server ~] # echo ${#name}
3 |
总结:本文主要介绍了对字符串的相关处理。包括求长度,查找替换,查找删除,大小写转换,赋值等的相关操作。当然,这些操作也可以用像grep,sed,awk的文本处理工具完成,但是这些操作是shell内置的功能,执行速度等方面要好于文本处理工具。