打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Bash shell 字符串操作符详解
本文详细介绍一下Bash shell字符串操作的有关内容。
首先需要明白的一点是我们通常所用的变量替代 $varname 其实是 ${varname}的一种简写形式。
其次,需要知道字符串操作的核心思想是:Bash shell字符串操作是通过在变量名'varname'和闭花括号'}'之间插入操作符来完成的。
在明确了以上2点以后,我们就可以开始学习Bash shell字符串操作的相关内容了。本文分为四部分进行介绍。
替换操作符 ${varname:-word} 含义:如果变量varname存在且非空, 返回变量的值;否则返回值word。
目的:如果变量未定义,则返回默认值word。
举例:如果变量count未定义,则:${count:-0}的值为0.
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-->
${varname:=word} 含义:如果变量varname存在且非空,返回变量的值;否则将变量的值设为值word后返回变量的值。
目的:如果变量varname未定义,则将其设置为默认值word.
举例:如果变量count未定义,则将其设为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
${varname:+word} 含义:如果变量varname存在且非空,返回值word;否则返回null。
目的:测试变量varname是否存在。
举例:如果变量count存在,返回1(表示存在)
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-->
${varname:?message} 含义:如果变量varname存在且非空,返回变量的值;否则打印信息"varname: message";如果message没有指定,则显示parameter null or not set。
目的:如果变量未定义,则打印错误信息。
举例:如果变量count未定义,打印消息"count: undefined!
root@/export/home/ftp/pub-->echo $count
root@/export/home/ftp/pub-->echo ${count:?"undefined"}
bash: count: undefined
${varname:offset:length} 含义:返回变量varname的子字符串,开始位置为offset,长度为length。注意索引开始位置为0。
目的:返回子字符串。
举例:如果变量count的值为 frogfootman,则:
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-->
模式匹配操作符${varname#pattern}含义:如果pattern匹配变量varname值的开始部分,删除最小的匹配部分并且返回变量剩余部分内容。
举例:
root@/export/home/ftp/pub-->echo $path
/export/home/ftp/pub
root@/export/home/ftp/pub-->echo ${path#*/}
export/home/ftp/pub
${varname##pattern}含义:如果pattern匹配变量varname值的开始部分,删除最大的匹配部分并且返回变量剩余部分内容。
举例:
root@/export/home/ftp/pub-->echo $path
/export/home/ftp/pub
root@/export/home/ftp/pub-->echo ${path##*/}
pub
${varname%pattern}含义:如果pattern匹配变量varname值的结尾部分,删除最小的匹配部分并且返回变量剩余部分内容。
举例:
root@/export/home/ftp/pub-->echo $path
/export/home/ftp/pub
root@/export/home/ftp/pub-->echo ${path%/*}
/export/home/ftp
${varname%%pattern}含义:如果pattern匹配变量varname值的结尾部分,删除最大的匹配部分并且返回变量剩余部分内容。
举例:
root@/export/home/ftp/pub-->echo $file
alicece
root@/export/home/ftp/pub-->echo ${file?*}
alice
root@/export/home/ftp/pub-->echo ${file%?*}
ali
${varname/pattern/string}含义:用值string替换varname中模式pattern可以匹配到的最大部分。仅替换第一次匹配。
举例:
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@/-->
${varname//pattern/string}含义:用值string替换varname中模式pattern可以匹配到的最大部分。全局匹配。
举例:
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/
变量长度${#varname} 含义:获取变量varname值长度。
举例:
root@/-->echo $path
/export/home/ftp/pub
root@/-->echo ${#path}
20
扩展模式匹配操作府注意:使用扩展模式匹配操作符时,shopt extglob必须为on.
root@/tmp/ewang-->shopt extglob
extglob         on
*(patternlist)含义:匹配patternlist中0个或多个pattern
举例:
root@/-->var=alicealicesophie
root@/-->echo ${var/*(alice|edward|stone)/ALICE}
ALICEsophie
+(patternlist)含义:匹配patternlist中1个或多个pattern
举例:
root@/-->var=alicesophiealicestone
root@/-->echo ${var/+(alice|edward|stone)/ALICE}
ALICEsophiealicestone
root@/-->echo ${var//+(alice|edward|stone)/ALICE}
ALICEsophieALICE
(patternlist)含义:匹配patternlist中0各或1个patter
@(patternlist)含义:匹配patterlist中的1个pattern.
举例:
root@/-->count=123.5
root@/-->echo ${count/@(.)/#}
123#5
!(patternlist)含义:匹配patterlist中所有pattern之外的pattern。
举例:
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-->
如对本文内容有任何问题,欢迎随时联系作者。
wang.caiqi@hotmail.com
谢谢!
大小写转换
以前写Bash Shell脚本,大小写转换通常这样做:
str="This is a Bash Shell script."
newstr=`tr '[A-Z]' '[a-z]' <<<"$str"`
今天看bash的man page,发现有更简单的方法
转小写,只需要将变量名字declare -l 后,再给变量赋值,变量的内容即为小写
转大写,只需要将变量名字declare -u后,再给变量赋值,变量的内容即为大写
例如:
m="abc"
echo $m # 输出为abc
declare -u m
echo $m # 输出为abc,
m="cde"
echo $m # 输出为CDE
declare -l m="HELL"
echo $m # 输出为hell
注意:
1,declare 不影响变量当前值,而是影响declare之后的赋值
2,通过declare -l/-u进行设置过的变量,可以通过declare +l/+u来取消设置。
3,Bash版本比较低的不行……
用tr
例如:UPPERCASE=$(echo $VARIABLE | tr '[a-z]' '[A-Z]')   (把VARIABLE的小写转换成大写)
LOWERCASE=$(echo $VARIABLE | tr '[A-Z]' '[a-z]')   (把VARIABLE的大写转换成小写)
用typeset
typeset -u VARIABLE  (把VARIABLE的小写转换成大写)
typeset -l  VARIABLE  (把VARIABLE的大写转换成小写)
例如:typeset -u VARIABLE
VARIABLE="True"
echo $VARIABLE
输出为TRUE
#!/bin/sh
#edit by www.jb51.net
# [:upper:] [ A - Z ]
# [:lower:] [ a - z ]
# [:digit:] [ 0 - 9 ]
# [:alnum:] [ 0 - 9 a - z A-Z]
# [:space:] 空格或t a b键
# [:alpha:] [ a - z A - Z ]
# tr
for f in *
do
echo $f | tr "[:upper:]" "[:lower:]"
done
#awk
#把当前目录下的所有小写文件名都改为大写文件名。
ls | awk '{printf("mv %s %s\n", $0, toupper($0))|"sh"}'
#把当前目录下的所有大写文件名都改为小写文件名。
ls | awk '{printf("mv %s %s\n", $0, tolower($0))|"sh"}'
#sed
file="test.txt"
cat $file | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
bash 漏洞解析
Shell 脚本面试问题大全
shell脚本基础-2
linux超级基础系列——shell变量(本地变量和环境变量)
Linux的环境变量设置方法
shell中的点命令与source命令的区别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服