魏蓝

以梦为马

导航

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

posted on 2022-03-10 21:45  魏蓝  阅读(720)  评论(0编辑  收藏  举报