shell脚本编程进阶字符串切片和高级变量
1.字符串切片
1)字符串变量var的长度(字符个数)
${#var}
例:
[root@centos7 ~]# name=魏蓝 [root@centos7 ~]# echo ${#name} 2 [root@centos7 ~]# str=`echo {a..z} | tr -d ' '` [root@centos7 ~]# echo ${#str} 26
2)切片
例:
[root@centos8 ~]# echo ${str:3} defghijklmnopqrstuvwxyz [root@centos8 ~]# echo ${str:3:4} defg
3)取字符串的最右侧n个字符,注意:冒号后必须有一个空白字符
${var: -length}
例:
[root@centos8 ~]# echo ${str: -5} vwxyz
4)抛头去尾
${var:offset: -length}
例:
[root@centos8 ~]# echo ${str:3: -3} defghijklmnopqrstuv
5)先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length前有空格,并且length>offset
${var: -length:-offset}
例:
[root@centos8 ~]# echo ${str: -6:-3} uvw
2.基于模式取子串
1)其中word可以指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word,删除字符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右
例:
[root@centos8 ~]# url=https://www.cnblogs.com/weilanxuesre/p/15987297.html [root@centos8 ~]# echo ${url#*/} /www.cnblogs.com/weilanxuesre/p/15987297.html
2)贪恋模式,以最后一个word为界删左留右
echo ${var##*word}
例:
[root@centos8 ~]# echo ${url##*/} 15987297.html
这是从左到右,下面说说从右到左
4)懒惰模式,从右向左的第一个word为界删右留左
${var%word*}
例:
[root@centos8 ~]# echo ${url%:*} https
5)贪婪模式,以最左的一个word为界,删左留右
${var%%word*}
例:
[root@centos8 ~]# echo ${url%%/*} https:
3.字符串的查找替换
1)查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之(懒惰模式)
${var/pattern/substr}
例:
[root@centos8 ~]# line=`getent passwd root` [root@centos8 ~]# echo ${line} root:x:0:0:root:/root:/bin/bash [root@centos8 ~]# echo ${line/root/weilan} weilan:x:0:0:root:/root:/bin/bash
2)将var中所有pattern字符串替换为substr(贪婪模式)
${var//pattern/substr}
例:
[root@centos8 ~]# echo ${line//root/weilan} weilan:x:0:0:weilan:/weilan:/bin/bash
3)替换行首
${var/#pattern/substr}
例:
[root@centos8 ~]# echo ${line/#root/weilan} weilan:x:0:0:root:/root:/bin/bash
4)替换行尾
${var/%pattern/substr}
例:
[root@centos8 ~]# echo ${line/%bash/haha} root:x:0:0:root:/root:/bin/haha
4.查找并删除
1)删除var中第一个pattern(懒惰)
${var/pattern}
例:
[root@centos8 ~]# echo ${line/root/} :x:0:0:root:/root:/bin/bash
2)删除var中所有pattern(贪婪)
${var//pattern}
例:
[root@centos8 ~]# echo ${line//root} :x:0:0::/:/bin/bash
3)删除以pattern为首的字符
${var/#pattern}
例:
[root@centos8 ~]# echo ${line/#root} :x:0:0:root:/root:/bin/bash
4)删除行尾
${var/%pattren}
例:
[root@centos8 ~]# echo ${line/%bash} root:x:0:0:root:/root:/bin/
5.字符大小写转换
1)大写
${var^^}
2)小写
${var,,}
例:
[root@centos8 ~]# line=`echo ${line^^}` [root@centos8 ~]# echo $line ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH [root@centos8 ~]# echo ${line,,} root:x:0:0:root:/root:/bin/bash
6.高级变量
1)
范例:
[root@centos8 ~]#title=ceo [root@centos8 ~]#name=${title-mage} [root@centos8 ~]#echo $name ceo [root@centos8 ~]#title= [root@centos8 ~]#name=${title-mage} [root@centos8 ~]#echo $name [root@centos8 ~]#unset title [root@centos8 ~]#name=${title-mage} [root@centos8 ~]#echo $name mage
2)高级变量用法-有类型变量
shell变量一般是无类型的,但可以用declare声明有类型的变量
declare【选项】变量名
选项:
-r 声明或显示只读变量 -i 将变量定义为整型数 -a 将变量定义为数组 -A 将变量定义为关联数组 -f 显示已定义的所有函数名及其内容 -F 仅显示已定义的所有函数名 -x 声明或显示环境变量和函数,相当于export -l 声明变量为小写字母 declare -l var=UPPER -u 声明变量为大写字母 declare -u var=lower -n make NAME a reference to the variable named by its value
例:转小写
[root@centos8 ~]# declare -l name=WEIlan [root@centos8 ~]# echo $name weilan
7.变量间接引用
1)eval命令:shell只能执行一次操作,所以我们可用eval命令执行两次操作,eval后必须跟上命令
例:
[root@centos8 ~]# n=20; eval echo {1..$n} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
例:创键1-10的账号
[root@centos8 ~]# n=10; for i in `eval echo {1..$n}`; do useradd user$i; done
例:
[root@centos8 ~]# i=a;j=1 [root@centos8 ~]# $i$j=haha bash: a1=haha: command not found... [root@centos8 ~]# eval $i$j=haha [root@centos8 ~]# echo ${a1} haha
2)间接变量引用
如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用
方法一
例:
[root@centos8 ~]# ceo=name;name=weilan [root@centos8 ~]# eval echo '$'$ceo weilan
[root@centos8 ~]# eval echo \$$ceo weilan
方法二:
[root@centos8 ~]# eval echo ${!ceo} weilan
范例:批量创建用户
[root@centos8 data]# vim creat_user.sh #!/bin/bash n=$# [ $n -eq 0 ]&&{ echo "Uage:`basename$0`username..."; exit 2; } for i in `eval echo {1..$n}`; do user=${!i} id $user &> /dev/null && echo $user is exist || { useradd $user; echo $user is created; } done
3)变量引用refernce
范例:
#!/bin/bash ceo=weilan title=ceo declare -n ref=$title [ -R ref ] && echo "reference" echo $ref ceo=wang echo $ref
记录于2022-3-10-21:46