前一篇:一、shell脚本语言基础
目录
背景:
一、字符串功能讲解
1、获取字符串的长度
2、字符串切片
3、字符串替换处理?
4、字符串截取
5、变量状态赋值?
6、字符串颜色
背景:
之前shell脚本语言文章中讲解了${}变量的引用,本文介绍的${}的另一个重要的功能,就是文本处理,单行文本基本上 可以满足日常运维工作的基本需求。
一、字符串功能讲解
1、获取字符串的长度
实例:
[root@node mnt]# cat test.sh
#!/bin/bash
VAR='hello world!'
echo $VAR
echo ${#VAR}
执行效果:
[root@node mnt]# sh test.sh
hello world!
12
这里大家可能有一个疑问了,这里加上标点符号也是11占位符,但是这里需要加入空格也是一个字符位的,所以这里是12位字符串长度。
2、字符串切片
字符串切片,简单的理解就从一个段字符串中安装一定的规则截取到我们想要的内容,有可能是前多少位的,也可以后多少位,或者是多少位到多少位的内容等等。
字符串切片的格式和基础的切片的格式是类似的,如下:
格式:
${parameter:offset}
${parameter:offset:length}
截取从 offset 个字符开始,向后 length 个字符,这里的offset和length都是数字的形式存在的,默认是从0开始的。
实例:
[root@node mnt]# cat test.sh
#!/bin/bash
VAR='hello world!'
echo "源参数值VAR=hello world!"
echo ${VAR}
echo "截取 hello 字符串"
echo ${VAR:0:5}
echo "截取 wo 字符"
echo ${VAR:6:2}
echo "截取 world!字符串"
echo ${VAR:5}
echo "截取最后一个字符"
echo ${VAR:(-1)}
echo "截取最后二个字符"
echo ${VAR:(-2)}
echo "截取从倒数第 3 个字符后的 2 个字符"
echo ${VAR:(-3):2}
?执行效果:
[root@node mnt]# sh test.sh
源参数值VAR=hello world!
hello world!
截取 hello 字符串
hello
截取 wo 字符
wo
截取 world!字符串
world!
截取最后一个字符
!
截取最后二个字符
d!
截取从倒数第 3 个字符后的 2 个字符
ld
这里可以发现一个规律就是正向的取值是按照0 1 2 3这样的格式的,反向取值,就是-1 -2 -3的格式形式的,这个取值最好是按照正向取值的好点,但是有些情况是反向取值好点的,就是在对变量进行取值的时候,无法判断变量的字符串的长度的时候反向取值是最好的。
这里有一个点需要注意一下,就是格式一直都是安装?offset:length,如果没有就是默认到了最大的长度值的。
3、字符串替换处理?
?格式:${parameter/pattern/string}
实例:
[root@node mnt]# cat test.sh
#!/bin/bash
VAR='hello world world!'
echo "将第一个 world 字符串替换为 WORLD"
echo ${VAR/world/WORLD}
echo "将全部 world 字符串替换为 WORLD"
echo ${VAR//world/WORLD}
echo "替换正则匹配为空"
VAR=123abc
echo "将不是数字的字符串去空"
echo ${VAR//[^0-9]/}
echo "将是数字的字符串去空"
echo ${VAR//[0-9]/}
执行效果:
[root@node mnt]# sh test.sh
将第一个 world 字符串替换为 WORLD
hello WORLD world!
将全部 world 字符串替换为 WORLD
hello WORLD WORLD!
替换正则匹配为空
将不是数字的字符串去空
123
将是数字的字符串去空
abc
?注意:patterm 前面开头一个正斜杠为只匹配第一个字符串,两个正斜杠为匹配所有字符,^在这里的表示非数字的字符匹配。
4、字符串截取
格式:
${parameter#word} ? # 删除匹配前缀
${parameter##word} ?
${parameter%word} ? # 删除匹配后缀
${parameter%%word}
# 去掉左边,最短匹配模式,##最长匹配模式。
% 去掉右边,最短匹配模式,%%最长匹配模式。??
?实例:
[root@node mnt]# cat test.sh
#!/bin/bash
URL="http://www.baidu.com/baike/user.html.htpp://www.xinlang.com/junshi/index.html"
echo $URL
echo "1.以//为分隔符截取右边字符串"
echo ${URL#*//}
echo "2.以//为分隔符截取右边字符串"
echo ${URL##*//}
echo "3.以/为分隔符截取右边字符串"
echo ${URL##*/}
echo "4.以/为分隔符截取右边字符串"
echo ${URL#*/}
echo "5.以//为分隔符截取左边字符串"
echo ${URL%%//*}
echo "6.以//为分隔符截取左边字符串"
echo ${URL%//*}
echo "7.以/为分隔符截取左边字符串"
echo ${URL%/*}
echo "8.以/为分隔符截取左边字符串"
echo ${URL%%/*}
echo "9.以.为分隔符截取左边"
echo ${URL%.*}
echo "10.以.为分隔符截取左边"
echo ${URL%%.*}
echo "11.以.为分隔符截取右边"
echo ${URL#*.}
echo "12.以.为分隔符截取右边"
echo ${URL##*.}
执行效果:
[root@node mnt]# sh test.sh
http://www.baidu.com/baike/user.html.htpp://www.xinlang.com/junshi/index.html
1.以//为分隔符截取右边字符串
www.baidu.com/baike/user.html.htpp://www.xinlang.com/junshi/index.html
2.以//为分隔符截取右边字符串
www.xinlang.com/junshi/index.html
3.以/为分隔符截取右边字符串
index.html
4.以/为分隔符截取右边字符串
/www.baidu.com/baike/user.html.htpp://www.xinlang.com/junshi/index.html
5.以//为分隔符截取左边字符串
http:
6.以//为分隔符截取左边字符串
http://www.baidu.com/baike/user.html.htpp:
7.以/为分隔符截取左边字符串
http://www.baidu.com/baike/user.html.htpp://www.xinlang.com/junshi
8.以/为分隔符截取左边字符串
http:
9.以.为分隔符截取左边
http://www.baidu.com/baike/user.html.htpp://www.xinlang.com/junshi/index
10.以.为分隔符截取左边
http://www
11.以.为分隔符截取右边
baidu.com/baike/user.html.htpp://www.xinlang.com/junshi/index.html
12.以.为分隔符截取右边
html
??注:
# 去掉左边,取右边的值的内容,取值的顺序是从左往右去匹配的,
#最短匹配模式,简单的理解就是第一个匹配的值,开始截取的;
##最长匹配模式,简单的理解就是最后一个匹配的值,开始截取的。
% 去掉右边,截取左边的内容,取值的顺序是从右往左去匹配,
%最短匹配模式,简单的理解就是第一个匹配的值,开始截取,
%%最长匹配模式。,简单的理解就是最后一个匹配的值,开始截取。
5、变量状态赋值?
?${VAR:-string} ?如果 VAR 变量为空则返回 string
${VAR:+string} ?如果 VAR 变量不为空则返回 string
${VAR:=string} ?如果 VAR 变量为空则重新赋值 VAR 变量值为 string
${VAR:?string} ?如果 VAR 变量为空则将 string 输出到 stderr?
实例:
[root@node mnt]$ cat test.sh
#!/bin/bash
echo "如果变量为空就返回 hello world!"
VAR_a=
echo ${VAR_a:-'hello world!'}
echo "如果变量不为空就返回 hello world!"
VAR_b="hello"
echo ${VAR_b:+'hello world!'}
echo "如果变量为空就重新赋值"
VAR_c=
echo ${VAR_c:=hello}
echo $VAR_c
echo "如果变量为空就将信息输出 stderr"
VAR_d=
echo ${VAR_d:?value is null}
?执行效果:
[root@node mnt]$ sh test.sh
如果变量为空就返回 hello world!
hello world!
如果变量不为空就返回 hello world!
hello world!
如果变量为空就重新赋值
hello
hello
如果变量为空就将信息输出 stderr
test.sh: line 17: VAR_d: value is null
注:最后的输入stderr,是执行输出报错信息?
6、字符串颜色
在日常的shell脚本开发的过程有一个场景就是讲报错的信息按照颜色进行打印显示的,如下就是讲解怎么打印字符串的颜色。
字体颜色 | 字体背景颜色 | 显示方式 | 颜色数字表示 | 颜色 | 颜色数字表示 | 颜色 | 30 | 黑色 | 40 | 黑色 | 0:终端默认设置? 1:高亮显示? 4:下划线? 5:闪烁? 7:反白显示? 8:隐藏? | 31 | 红色 | 41 | 深红 | 32 | 绿色 | 42 | 绿色 | 33 | 黄色 | 43 | 黄色 | 34 | 蓝色 | 44 | 蓝色 | 35 | 紫色 | 45 | 紫色 | 36 | 深绿 | 46 | 深绿 | 37 | 白色 | 47 | 白色 |
格式:
\033[1;31;40m # 1 是显示方式,可选。31 是字体颜色。40m 是字体背景颜色。
\033[0m # 恢复终端默认颜色,即取消颜色设置
实例:
[root@node mnt]# cat test.sh
#!/bin/bash
echo "打印字体颜色"
for i in {31..37}
do
echo -e "\033[$i;40mHello world!\033[0m"
done
echo "打印背景颜色"
for i in {41..47}
do
echo -e "\033[47;${i}mHello world!\033[0m"
done
echo "显示方式"
for i in {1..8}
do
echo -e "\033[$i;31;40mHello world!\033[0m"
done
执行效果:
?
注:这里就是字符串的颜色打印 ,
总结:以上就是shell的字符串相关的讲解了,在shell脚本语言的开发过程中会常使用字符串的处理的,希望可以帮助到大家,能帮助到大家记得点赞!!!
|