字符串截取
字符串截取 格式使用${}表达式 ${ var:起始位置:长度};编号从0开始,可省略使用expr substr expr substr "$var" 起始位置 长度;起始位置编号从1开始使用cut工具 echo $var | cut -b 起始位置-结束位置;起始位置编号从1开始
字符串的匹配删除
格式 ${变量名#*关键词} 从左到右,最短匹配删除;#用来删除头部,*通配 ${变量名##*关键词} 从左到右,最长匹配删除;#用来删除头部,*通配 ${变量名%关键词*} 从右到左,最短匹配删除;%用来删除尾部,*通配 ${变量名%%关键词*} 从右到左,最长匹配删除;%用来删除尾部,*通配
文件批量改名
例子:将扩展名.doc改为.txt
#!/bin/bashfor FILE in *.docdo mv $FILE ${FILE%.doc}.txtdone
字符串的替换
格式${ var/old/new} 只替换第一个匹配结果 ${ var//old/new} 替换全部匹配结果 ${string/#substring/replace} 如果$string前缀匹配$substring,就用$replace来代替匹配$substring ${ string/%substring/replace} 如果$string后缀匹配$substring,就用$replace来代替匹配$substring
依次举例说明:定义OLDBOY变量,内容为”I am oldboy”I am oldboy1)返回字符串OLDBOY变量字符串的长度[root@Web ~]# echo ${#OLDBOY}11[root@Web ~]# echo ${OLDBOY} |wc -m122)截取OLDBOY变量字符串从第2个字符之后开始取,默认取后面字符的全部,第2个字符不包括在内。也可理解为删除前面的多少个字符[root@Web ~]# echo ${OLDBOY:2}am oldboy 3)截取OLDBOY变量字符串从第2个字符之后开始取,取两个字符。[root@Web ~]# echo ${OLDBOY:2:2}am提示:类似cut -c参数[root@Web ~]# echo ${OLDBOY}|cut -c 1-4I am[root@Web ~]# echo ${OLDBOY}|cut -c 3-4am4)从变量$OLDBOY开头开始删除最短匹配”I am”子串[root@Web ~]# echo ${OLDBOY#I am}oldboy 5)从变量$OLDBOY开头开始删除最长匹配”I am old”子串[root@Web ~]# echo ${OLDBOY##I am old}boy6)从变量$OLDBOY结尾开始删除最短匹配oldboy子串[root@Web ~]# echo ${OLDBOY%oldboy}I am7)从变量$OLDBOY结尾开始删除最长匹配boy子串[root@Web ~]# echo ${OLDBOY%%boy}I am old8)使用etiantian字符串,来代替变量$OLDBOY第一个匹配的oldboy字符串[root@Web ~]# echo ${OLDBOY/oldboy/etiantian}I am etiantian 9)使用etiantian字符串,来代替变量$OLDBOY结尾匹配的oldboy字符串[root@Web ~]# echo ${OLDBOY/%oldboy/etiantian}I am etiantian10)使用He is字符串,来代替从变量$OLDBOY开头开始匹配的I am字符串[root@Web ~]# echo ${OLDBOY/#I am/He is}He is oldboy
生产场景用法实例:
1)变量结尾删除生产实践:
功能描述如下表:
批量文件改名案例实践:问题1:把下面所有的文件名中的finishied内容去掉。[root@localhost ~]# mkdir /test[root@localhost ~]# cd /test[root@localhost test]# cat a.log stu_102999_2_finish.jpgstu_102999_3_finish.jpgstu_102999_4_finish.jpg[root@localhost test]# for f in `cat a.log`;do touch $f;done[root@localhost test]# ll总用量 4-rw-r--r--. 1 root root 72 3月 30 22:24 a.log-rw-r--r--. 1 root root 0 3月 30 22:25 stu_102999_2_finish.jpg-rw-r--r--. 1 root root 0 3月 30 22:25 stu_102999_3_finish.jpg-rw-r--r--. 1 root root 0 3月 30 22:25 stu_102999_4_finish.jpg[root@localhost test]# cat p.sh for f in `ls *.jpg` do mv $f `echo ${f%finish*}.jpg`done[root@localhost test]# ll总用量 8-rw-r--r--. 1 root root 72 3月 30 22:24 a.log-rw-r--r--. 1 root root 0 3月 30 22:24 cat-rw-r--r--. 1 root root 64 3月 30 22:49 p.sh-rw-r--r--. 1 root root 0 3月 30 22:48 stu_102999_2_.jpg-rw-r--r--. 1 root root 0 3月 30 22:48 stu_102999_3_.jpg-rw-r--r--. 1 root root 0 3月 30 22:48 stu_102999_4_.jpg
2)变量结尾替换生产实践:
问题:把下面文件的大写扩展名变小写扩展名[root@localhost test]# cat p.shfor f in `ls *.jpg` do mv $f `echo "${f/%jpg/JPG}"`done[root@localhost test]# sh p.sh[root@localhost test]# ll总用量 8-rw-r--r--. 1 root root 72 3月 30 22:24 a.log-rw-r--r--. 1 root root 0 3月 30 22:24 cat-rw-r--r--. 1 root root 63 3月 30 22:52 p.sh-rw-r--r--. 1 root root 0 3月 30 22:48 stu_102999_2_.JPG-rw-r--r--. 1 root root 0 3月 30 22:48 stu_102999_3_.JPG-rw-r--r--. 1 root root 0 3月 30 22:48 stu_102999_4_.JPG
1 命令名称:rename-Rename files
2 命令功能:给文件重命名
3命令语法: rename from to file 提示:这里的用法”from to file”一开始会被大家误解,实际上还是看下面表格吧:
还是看实际例子吧!
准备测试数据:
[root@Web ~]# mkdir /test[root@Web ~]# cd /test[root@Web test]# for f in `seq 9`;do touch foo$f.htm;done[root@Web test]# ls -l总用量 0-rw-r--r--. 1 root root 0 4月 12 21:58 foo1.htm-rw-r--r--. 1 root root 0 4月 12 21:58 foo2.htm-rw-r--r--. 1 root root 0 4月 12 21:58 foo3.htm-rw-r--r--. 1 root root 0 4月 12 21:58 foo4.htm-rw-r--r--. 1 root root 0 4月 12 21:58 foo5.htm-rw-r--r--. 1 root root 0 4月 12 21:58 foo6.htm-rw-r--r--. 1 root root 0 4月 12 21:58 foo7.htm-rw-r--r--. 1 root root 0 4月 12 21:58 foo8.htm-rw-r--r--. 1 root root 0 4月 12 21:58 foo9.htm[root@localhost test]# rename .JPG .htm *.JPG[root@localhost test]# ll总用量 8-rw-r--r--. 1 root root 72 3月 30 22:24 a.log-rw-r--r--. 1 root root 0 3月 30 22:24 cat-rw-r--r--. 1 root root 63 3月 30 22:52 p.sh-rw-r--r--. 1 root root 0 3月 30 22:48 stu_102999_2_.htm-rw-r--r--. 1 root root 0 3月 30 22:48 stu_102999_3_.htm-rw-r--r--. 1 root root 0 3月 30 22:48 stu_102999_4_.htm[root@localhost test]# rename 102999 oldboy *.htm[root@localhost test]# ll总用量 8-rw-r--r--. 1 root root 72 3月 30 22:24 a.log-rw-r--r--. 1 root root 0 3月 30 22:24 cat-rw-r--r--. 1 root root 63 3月 30 22:52 p.sh-rw-r--r--. 1 root root 0 3月 30 22:48 stu_oldboy_2_.htm-rw-r--r--. 1 root root 0 3月 30 22:48 stu_oldboy_3_.htm
变量初值处理
取值
取值,${
var:-word}
若变量var已存在且非null,则返回$var的值否则返回字串"word",变量var值不变用途: 如果变量没定义 返回默认值
赋值
赋值,${var:=word}
若变量var已存在且非null,则返回$var的值否则返回字串"word",并赋值给变量var用途: 如果变量没定义 给变量赋值
有值时提示
有值时提示,${var:+"提示信息"}
若变量var已存在且非null,则给出提示否则返回NUll(空值)用途 : 测试变量是否定义
无值时提示
无值时提示,${var:?"提示信息"}
若变量var已存在且非null,则返回$var的值否则给出提示信息(若省略,则用默认提示)用途: 捕捉由于变量未定义所导致的错误
练习:
a、提示输入一个正整数x,求从1到x的和
b、若用户未输入值(直接回车),则赋值x=1
#!/bin/bashread -p "请输入一个正整数:" xx=${x:-1};i=1;SUM=0while [ $i -le $x ]do let SUM+=i;let i++doneecho "从1到$x的总和是:$SUM"
例题:
mycluster.sh
检查集群中主机的物理连接状态,要求如下
能够设置检查主机的台数 和 检查哪些主机
把不在线主机的ip地址和时间保存到/clusterdir目录下的stat.txt文件里并把不在线主机的ip地址 时间 台数 输出到屏幕上