本文详细介绍一下Bash shell字符串操作的有关内容。
首先需要明白的一点是我们通常所用的变量替代 $varname 其实是 ${varname}的一种简写形式。
其次,需要知道字符串操作的核心思想是:Bash shell字符串操作是通过在变量名'varname'和闭花括号'}'之间插入操作符来完成的。
在明确了以上2点以后,我们就可以开始学习Bash shell字符串操作的相关内容了。本文分为四部分进行介绍。
* 替换操作符
o ${varname:-word}
+ 含义:如果变量varname存在且非空, 返回变量的值;否则返回值word。
+ 目的:如果变量未定义,则返回默认值word。
+ 举例:如果变量count未定义,则:${count:-0}的值为0.
1. root@/export/home/ftp/pub-->echo $count
2.
3. root@/export/home/ftp/pub-->echo ${count:-0}
4. 0
5. root@/export/home/ftp/pub-->echo $count
6.
7. root@/export/home/ftp/pub-->
root@/export/home/ftp/pub-->echo $count root@/export/home/ftp/pub-->echo ${count:-0} 0 root@/export/home/ftp/pub-->echo $count root@/export/home/ftp/pub-->
o ${varname:=word}
+ 含义:如果变量varname存在且非空,返回变量的值;否则将变量的值设为值word后返回变量的值。
+ 目的:如果变量varname未定义,则将其设置为默认值word.
+ 举例:如果变量count未定义,则将其设为0
1. root@/export/home/ftp/pub-->echo $count
2.
3. root@/export/home/ftp/pub-->echo ${count:=0}
4. 0
5. root@/export/home/ftp/pub-->echo $count
6. 0
root@/export/home/ftp/pub-->echo $count root@/export/home/ftp/pub-->echo ${count:=0} 0 root@/export/home/ftp/pub-->echo $count 0
o ${varname:+word}
+ 含义:如果变量varname存在且非空,返回值word;否则返回null。
+ 目的:测试变量varname是否存在。
+ 举例:如果变量count存在,返回1(表示存在)
1. root@/export/home/ftp/pub-->echo $count
2. 0
3. root@/export/home/ftp/pub-->echo ${count:+1}
4. 1
5. root@/export/home/ftp/pub-->unset count
6. root@/export/home/ftp/pub-->echo $count
7.
8. root@/export/home/ftp/pub-->echo ${count:+1}
9.
10. root@/export/home/ftp/pub-->
root@/export/home/ftp/pub-->echo $count 0 root@/export/home/ftp/pub-->echo ${count:+1} 1 root@/export/home/ftp/pub-->unset count root@/export/home/ftp/pub-->echo $count root@/export/home/ftp/pub-->echo ${count:+1} root@/export/home/ftp/pub-->
o ${varname:?message}
+ 含义:如果变量varname存在且非空,返回变量的值;否则打印信息"varname: message";如果message没有指定,则显示parameter null or not set。
+ 目的:如果变量未定义,则打印错误信息。
+ 举例:如果变量count未定义,打印消息"count: undefined!
1. root@/export/home/ftp/pub-->echo $count
2.
3. root@/export/home/ftp/pub-->echo ${count:?"undefined"}
4. bash: count: undefined
root@/export/home/ftp/pub-->echo $count root@/export/home/ftp/pub-->echo ${count:?"undefined"} bash: count: undefined
o ${varname:offset:length}
+ 含义:返回变量varname的子字符串,开始位置为offset,长度为length。注意索引开始位置为0。
+ 目的:返回子字符串。
+ 举例:如果变量count的值为 frogfootman,则:
1. root@/export/home/ftp/pub-->count=frogfootman
2. root@/export/home/ftp/pub-->echo ${count:4}
3. footman
4. root@/export/home/ftp/pub-->echo ${count:4:4}
5. foot
6. root@/export/home/ftp/pub-->
root@/export/home/ftp/pub-->count=frogfootman root@/export/home/ftp/pub-->echo ${count:4} footman root@/export/home/ftp/pub-->echo ${count:4:4} foot root@/export/home/ftp/pub-->
* 模式匹配操作符
o ${varname#pattern}
+ 含义:如果pattern匹配变量varname值的开始部分,删除最小的匹配部分并且返回变量剩余部分内容。
+ 举例:
1. root@/export/home/ftp/pub-->echo $path
2. /export/home/ftp/pub
3. root@/export/home/ftp/pub-->echo ${path#*/}
4. export/home/ftp/pub
root@/export/home/ftp/pub-->echo $path /export/home/ftp/pub root@/export/home/ftp/pub-->echo ${path#*/} export/home/ftp/pub
o ${varname##pattern}
+ 含义:如果pattern匹配变量varname值的开始部分,删除最大的匹配部分并且返回变量剩余部分内容。
+ 举例:
1. root@/export/home/ftp/pub-->echo $path
2. /export/home/ftp/pub
3. root@/export/home/ftp/pub-->echo ${path##*/}
4. pub
root@/export/home/ftp/pub-->echo $path /export/home/ftp/pub root@/export/home/ftp/pub-->echo ${path##*/} pub
o ${varname%pattern}
+ 含义:如果pattern匹配变量varname值的结尾部分,删除最小的匹配部分并且返回变量剩余部分内容。
+ 举例:
1. root@/export/home/ftp/pub-->echo $path
2. /export/home/ftp/pub
3. root@/export/home/ftp/pub-->echo ${path%/*}
4. /export/home/ftp
root@/export/home/ftp/pub-->echo $path /export/home/ftp/pub root@/export/home/ftp/pub-->echo ${path%/*} /export/home/ftp
o ${varname%%pattern}
+ 含义:如果pattern匹配变量varname值的结尾部分,删除最大的匹配部分并且返回变量剩余部分内容。
+ 举例:
1. root@/export/home/ftp/pub-->echo $file
2. alicece
3. root@/export/home/ftp/pub-->echo ${file%ce*}
4. alice
5. root@/export/home/ftp/pub-->echo ${file%%ce*}
6. ali
root@/export/home/ftp/pub-->echo $file alicece root@/export/home/ftp/pub-->echo ${file%ce*} alice root@/export/home/ftp/pub-->echo ${file%%ce*} ali
o ${varname/pattern/string}
+ 含义:用值string替换varname中模式pattern可以匹配到的最大部分。仅替换第一次匹配。
+ 举例:
1. root@/-->echo $PATH
2. /usr/sbin:/usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/
3. root@/-->echo -e ${PATH/:/'\n'}
4. /usr/sbin
5. /usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/
6. root@/-->
root@/-->echo $PATH /usr/sbin:/usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/ root@/-->echo -e ${PATH/:/'\n'} /usr/sbin /usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/ root@/-->
o ${varname//pattern/string}
+ 含义:用值string替换varname中模式pattern可以匹配到的最大部分。全局匹配。
+ 举例:
1. root@/-->echo $PATH
2. /usr/sbin:/usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/
3. root@/-->echo -e ${PATH//:/'\n'}
4. /usr/sbin
5. /usr/bin
6. /export/home/ftp/pub/
7. /etc/vx/bin
8. /opt/VRTS/bin
9. /opt/VRTSvcs/bin
10. /opt/VRTSat/bin
11. /sbin
12. /usr/sbin
13. /usr/local/bin
14. /export/home/ftp/pub/
root@/-->echo $PATH /usr/sbin:/usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/ root@/-->echo -e ${PATH//:/'\n'} /usr/sbin /usr/bin /export/home/ftp/pub/ /etc/vx/bin /opt/VRTS/bin /opt/VRTSvcs/bin /opt/VRTSat/bin /sbin /usr/sbin /usr/local/bin /export/home/ftp/pub/
* 变量长度
o ${#varname}
+ 含义:获取变量varname值长度。
+ 举例:
1. root@/-->echo $path
2. /export/home/ftp/pub
3. root@/-->echo ${#path}
4. 20
root@/-->echo $path /export/home/ftp/pub root@/-->echo ${#path} 20
* 扩展模式匹配操作府
o 注意:使用扩展模式匹配操作符时,shopt extglob必须为on.
1. root@/tmp/ewang-->shopt extglob
2. extglob on
root@/tmp/ewang-->shopt extglob extglob on
o *(patternlist)
+ 含义:匹配patternlist中0个或多个pattern
+ 举例:
1. root@/-->var=alicealicesophie
2. root@/-->echo ${var/*(alice|edward|stone)/ALICE}
3. ALICEsophie
root@/-->var=alicealicesophie root@/-->echo ${var/*(alice|edward|stone)/ALICE} ALICEsophie
o +(patternlist)
+ 含义:匹配patternlist中1个或多个pattern
+ 举例:
1. root@/-->var=alicesophiealicestone
2. root@/-->echo ${var/+(alice|edward|stone)/ALICE}
3. ALICEsophiealicestone
4. root@/-->echo ${var//+(alice|edward|stone)/ALICE}
5. ALICEsophieALICE
root@/-->var=alicesophiealicestone root@/-->echo ${var/+(alice|edward|stone)/ALICE} ALICEsophiealicestone root@/-->echo ${var//+(alice|edward|stone)/ALICE} ALICEsophieALICE
o ?(patternlist)
+ 含义:匹配patternlist中0各或1个patter
o @(patternlist)
+ 含义:匹配patterlist中的1个pattern.
+ 举例:
1. root@/-->count=123.5
2. root@/-->echo ${count/@(.)/#}
3. 123#5
root@/-->count=123.5 root@/-->echo ${count/@(.)/#} 123#5
o !(patternlist)
+ 含义:匹配patterlist中所有pattern之外的pattern。
+ 举例:
1. root@/tmp/ewang-->ls
2. abc mn tv1 vt0 vt1 vt2 vt3
3. root@/tmp/ewang-->rm -fr !(vt+([0-9]))
4. root@/tmp/ewang-->ls
5. vt0 vt1 vt2 vt3
6. root@/tmp/ewang-->
root@/tmp/ewang-->ls abc mn tv1 vt0 vt1 vt2 vt3 root@/tmp/ewang-->rm -fr !(vt+([0-9])) root@/tmp/ewang-->ls vt0 vt1 vt2 vt3 root@/tmp/ewang-->
首先需要明白的一点是我们通常所用的变量替代 $varname 其实是 ${varname}的一种简写形式。
其次,需要知道字符串操作的核心思想是:Bash shell字符串操作是通过在变量名'varname'和闭花括号'}'之间插入操作符来完成的。
在明确了以上2点以后,我们就可以开始学习Bash shell字符串操作的相关内容了。本文分为四部分进行介绍。
* 替换操作符
o ${varname:-word}
+ 含义:如果变量varname存在且非空, 返回变量的值;否则返回值word。
+ 目的:如果变量未定义,则返回默认值word。
+ 举例:如果变量count未定义,则:${count:-0}的值为0.
1. root@/export/home/ftp/pub-->echo $count
2.
3. root@/export/home/ftp/pub-->echo ${count:-0}
4. 0
5. root@/export/home/ftp/pub-->echo $count
6.
7. root@/export/home/ftp/pub-->
root@/export/home/ftp/pub-->echo $count root@/export/home/ftp/pub-->echo ${count:-0} 0 root@/export/home/ftp/pub-->echo $count root@/export/home/ftp/pub-->
o ${varname:=word}
+ 含义:如果变量varname存在且非空,返回变量的值;否则将变量的值设为值word后返回变量的值。
+ 目的:如果变量varname未定义,则将其设置为默认值word.
+ 举例:如果变量count未定义,则将其设为0
1. root@/export/home/ftp/pub-->echo $count
2.
3. root@/export/home/ftp/pub-->echo ${count:=0}
4. 0
5. root@/export/home/ftp/pub-->echo $count
6. 0
root@/export/home/ftp/pub-->echo $count root@/export/home/ftp/pub-->echo ${count:=0} 0 root@/export/home/ftp/pub-->echo $count 0
o ${varname:+word}
+ 含义:如果变量varname存在且非空,返回值word;否则返回null。
+ 目的:测试变量varname是否存在。
+ 举例:如果变量count存在,返回1(表示存在)
1. root@/export/home/ftp/pub-->echo $count
2. 0
3. root@/export/home/ftp/pub-->echo ${count:+1}
4. 1
5. root@/export/home/ftp/pub-->unset count
6. root@/export/home/ftp/pub-->echo $count
7.
8. root@/export/home/ftp/pub-->echo ${count:+1}
9.
10. root@/export/home/ftp/pub-->
root@/export/home/ftp/pub-->echo $count 0 root@/export/home/ftp/pub-->echo ${count:+1} 1 root@/export/home/ftp/pub-->unset count root@/export/home/ftp/pub-->echo $count root@/export/home/ftp/pub-->echo ${count:+1} root@/export/home/ftp/pub-->
o ${varname:?message}
+ 含义:如果变量varname存在且非空,返回变量的值;否则打印信息"varname: message";如果message没有指定,则显示parameter null or not set。
+ 目的:如果变量未定义,则打印错误信息。
+ 举例:如果变量count未定义,打印消息"count: undefined!
1. root@/export/home/ftp/pub-->echo $count
2.
3. root@/export/home/ftp/pub-->echo ${count:?"undefined"}
4. bash: count: undefined
root@/export/home/ftp/pub-->echo $count root@/export/home/ftp/pub-->echo ${count:?"undefined"} bash: count: undefined
o ${varname:offset:length}
+ 含义:返回变量varname的子字符串,开始位置为offset,长度为length。注意索引开始位置为0。
+ 目的:返回子字符串。
+ 举例:如果变量count的值为 frogfootman,则:
1. root@/export/home/ftp/pub-->count=frogfootman
2. root@/export/home/ftp/pub-->echo ${count:4}
3. footman
4. root@/export/home/ftp/pub-->echo ${count:4:4}
5. foot
6. root@/export/home/ftp/pub-->
root@/export/home/ftp/pub-->count=frogfootman root@/export/home/ftp/pub-->echo ${count:4} footman root@/export/home/ftp/pub-->echo ${count:4:4} foot root@/export/home/ftp/pub-->
* 模式匹配操作符
o ${varname#pattern}
+ 含义:如果pattern匹配变量varname值的开始部分,删除最小的匹配部分并且返回变量剩余部分内容。
+ 举例:
1. root@/export/home/ftp/pub-->echo $path
2. /export/home/ftp/pub
3. root@/export/home/ftp/pub-->echo ${path#*/}
4. export/home/ftp/pub
root@/export/home/ftp/pub-->echo $path /export/home/ftp/pub root@/export/home/ftp/pub-->echo ${path#*/} export/home/ftp/pub
o ${varname##pattern}
+ 含义:如果pattern匹配变量varname值的开始部分,删除最大的匹配部分并且返回变量剩余部分内容。
+ 举例:
1. root@/export/home/ftp/pub-->echo $path
2. /export/home/ftp/pub
3. root@/export/home/ftp/pub-->echo ${path##*/}
4. pub
root@/export/home/ftp/pub-->echo $path /export/home/ftp/pub root@/export/home/ftp/pub-->echo ${path##*/} pub
o ${varname%pattern}
+ 含义:如果pattern匹配变量varname值的结尾部分,删除最小的匹配部分并且返回变量剩余部分内容。
+ 举例:
1. root@/export/home/ftp/pub-->echo $path
2. /export/home/ftp/pub
3. root@/export/home/ftp/pub-->echo ${path%/*}
4. /export/home/ftp
root@/export/home/ftp/pub-->echo $path /export/home/ftp/pub root@/export/home/ftp/pub-->echo ${path%/*} /export/home/ftp
o ${varname%%pattern}
+ 含义:如果pattern匹配变量varname值的结尾部分,删除最大的匹配部分并且返回变量剩余部分内容。
+ 举例:
1. root@/export/home/ftp/pub-->echo $file
2. alicece
3. root@/export/home/ftp/pub-->echo ${file%ce*}
4. alice
5. root@/export/home/ftp/pub-->echo ${file%%ce*}
6. ali
root@/export/home/ftp/pub-->echo $file alicece root@/export/home/ftp/pub-->echo ${file%ce*} alice root@/export/home/ftp/pub-->echo ${file%%ce*} ali
o ${varname/pattern/string}
+ 含义:用值string替换varname中模式pattern可以匹配到的最大部分。仅替换第一次匹配。
+ 举例:
1. root@/-->echo $PATH
2. /usr/sbin:/usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/
3. root@/-->echo -e ${PATH/:/'\n'}
4. /usr/sbin
5. /usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/
6. root@/-->
root@/-->echo $PATH /usr/sbin:/usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/ root@/-->echo -e ${PATH/:/'\n'} /usr/sbin /usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/ root@/-->
o ${varname//pattern/string}
+ 含义:用值string替换varname中模式pattern可以匹配到的最大部分。全局匹配。
+ 举例:
1. root@/-->echo $PATH
2. /usr/sbin:/usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/
3. root@/-->echo -e ${PATH//:/'\n'}
4. /usr/sbin
5. /usr/bin
6. /export/home/ftp/pub/
7. /etc/vx/bin
8. /opt/VRTS/bin
9. /opt/VRTSvcs/bin
10. /opt/VRTSat/bin
11. /sbin
12. /usr/sbin
13. /usr/local/bin
14. /export/home/ftp/pub/
root@/-->echo $PATH /usr/sbin:/usr/bin:/export/home/ftp/pub/:/etc/vx/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:/opt/VRTSat/bin:/sbin:/usr/sbin:/usr/local/bin:/export/home/ftp/pub/ root@/-->echo -e ${PATH//:/'\n'} /usr/sbin /usr/bin /export/home/ftp/pub/ /etc/vx/bin /opt/VRTS/bin /opt/VRTSvcs/bin /opt/VRTSat/bin /sbin /usr/sbin /usr/local/bin /export/home/ftp/pub/
* 变量长度
o ${#varname}
+ 含义:获取变量varname值长度。
+ 举例:
1. root@/-->echo $path
2. /export/home/ftp/pub
3. root@/-->echo ${#path}
4. 20
root@/-->echo $path /export/home/ftp/pub root@/-->echo ${#path} 20
* 扩展模式匹配操作府
o 注意:使用扩展模式匹配操作符时,shopt extglob必须为on.
1. root@/tmp/ewang-->shopt extglob
2. extglob on
root@/tmp/ewang-->shopt extglob extglob on
o *(patternlist)
+ 含义:匹配patternlist中0个或多个pattern
+ 举例:
1. root@/-->var=alicealicesophie
2. root@/-->echo ${var/*(alice|edward|stone)/ALICE}
3. ALICEsophie
root@/-->var=alicealicesophie root@/-->echo ${var/*(alice|edward|stone)/ALICE} ALICEsophie
o +(patternlist)
+ 含义:匹配patternlist中1个或多个pattern
+ 举例:
1. root@/-->var=alicesophiealicestone
2. root@/-->echo ${var/+(alice|edward|stone)/ALICE}
3. ALICEsophiealicestone
4. root@/-->echo ${var//+(alice|edward|stone)/ALICE}
5. ALICEsophieALICE
root@/-->var=alicesophiealicestone root@/-->echo ${var/+(alice|edward|stone)/ALICE} ALICEsophiealicestone root@/-->echo ${var//+(alice|edward|stone)/ALICE} ALICEsophieALICE
o ?(patternlist)
+ 含义:匹配patternlist中0各或1个patter
o @(patternlist)
+ 含义:匹配patterlist中的1个pattern.
+ 举例:
1. root@/-->count=123.5
2. root@/-->echo ${count/@(.)/#}
3. 123#5
root@/-->count=123.5 root@/-->echo ${count/@(.)/#} 123#5
o !(patternlist)
+ 含义:匹配patterlist中所有pattern之外的pattern。
+ 举例:
1. root@/tmp/ewang-->ls
2. abc mn tv1 vt0 vt1 vt2 vt3
3. root@/tmp/ewang-->rm -fr !(vt+([0-9]))
4. root@/tmp/ewang-->ls
5. vt0 vt1 vt2 vt3
6. root@/tmp/ewang-->
root@/tmp/ewang-->ls abc mn tv1 vt0 vt1 vt2 vt3 root@/tmp/ewang-->rm -fr !(vt+([0-9])) root@/tmp/ewang-->ls vt0 vt1 vt2 vt3 root@/tmp/ewang-->