shell脚本编程进阶字符串切片和高级变量
1.字符串切片
1)字符串变量var的长度(字符个数)
${#var}
例:
1 2 3 4 5 6 | [root@centos7 ~] # name=魏蓝 [root@centos7 ~] # echo ${#name} 2 [root@centos7 ~] # str=`echo {a..z} | tr -d ' '` [root@centos7 ~] # echo ${#str} 26 |
2)切片
例:
1 2 3 4 | [root@centos8 ~] # echo ${str:3} defghijklmnopqrstuvwxyz [root@centos8 ~] # echo ${str:3:4} defg |
3)取字符串的最右侧n个字符,注意:冒号后必须有一个空白字符
${var: -length}
例:
1 2 | [root@centos8 ~] # echo ${str: -5} vwxyz |
4)抛头去尾
${var:offset: -length}
例:
1 2 | [root@centos8 ~] # echo ${str:3: -3} defghijklmnopqrstuv |
5)先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length前有空格,并且length>offset
${var: -length:-offset}
例:
1 2 | [root@centos8 ~] # echo ${str: -6:-3} uvw |
2.基于模式取子串
1)其中word可以指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word,删除字符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右
例:
1 2 3 | [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}
例:
1 2 | [root@centos8 ~] # echo ${url##*/} 15987297.html |
这是从左到右,下面说说从右到左
4)懒惰模式,从右向左的第一个word为界删右留左
${var%word*}
例:
1 2 | [root@centos8 ~] # echo ${url%:*} https |
5)贪婪模式,以最左的一个word为界,删左留右
${var%%word*}
例:
1 2 | [root@centos8 ~] # echo ${url%%/*} https: |
3.字符串的查找替换
1)查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之(懒惰模式)
${var/pattern/substr}
例:
1 2 3 4 5 | [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}
例:
1 2 | [root@centos8 ~] # echo ${line//root/weilan} weilan:x:0:0:weilan: /weilan : /bin/bash |
3)替换行首
${var/#pattern/substr}
例:
1 2 | [root@centos8 ~] # echo ${line/#root/weilan} weilan:x:0:0:root: /root : /bin/bash |
4)替换行尾
${var/%pattern/substr}
例:
1 2 | [root@centos8 ~] # echo ${line/%bash/haha} root:x:0:0:root: /root : /bin/haha |
4.查找并删除
1)删除var中第一个pattern(懒惰)
${var/pattern}
例:
1 2 | [root@centos8 ~] # echo ${line/root/} :x:0:0:root: /root : /bin/bash |
2)删除var中所有pattern(贪婪)
${var//pattern}
例:
1 2 | [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}
例:
1 2 | [root@centos8 ~] # echo ${line/%bash} root:x:0:0:root: /root : /bin/ |
5.字符大小写转换
1)大写
${var^^}
2)小写
${var,,}
例:
1 2 3 4 5 | [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)
范例:
1 2 3 4 5 6 7 8 9 10 11 | [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
例:转小写
1 2 3 | [root@centos8 ~] # declare -l name=WEIlan [root@centos8 ~] # echo $name weilan |
7.变量间接引用
1)eval命令:shell只能执行一次操作,所以我们可用eval命令执行两次操作,eval后必须跟上命令
例:
1 2 | [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的账号
1 2 | [root@centos8 ~] # n=10; for i in `eval echo {1..$n}`; do useradd user$i; done |
例:
1 2 3 4 5 6 | [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)间接变量引用
如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用
方法一
例:
1 2 3 | [root@centos8 ~] # ceo=name;name=weilan [root@centos8 ~] # eval echo '$'$ceo weilan |
1 2 | [root@centos8 ~] # eval echo \$$ceo weilan |
方法二:
1 2 | [root@centos8 ~] # eval echo ${!ceo} weilan |
范例:批量创建用户
1 2 3 4 5 6 7 8 9 | [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
范例:
1 2 3 4 5 6 7 8 9 | #!/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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话