字符串切片
格式
${var:offset:number}
- 取从左侧几个后的几个字符串
[root@study102 sh]# var=obanm
[root@study102 sh]# echo ${var:1:3}
ban
斜杠因为markdown语法需要转义冒号生成
- 取最右侧的几个字符串
和从左侧取不一样,这取几个字符。而没有界定位置。冒号和杠之间必须有空格。
[root@study102 sh]# echo ${var: -3}
anm
基于模式取字符串
${vara#*word}或${vara##*word}
和
${var%*word}或${var%%*word}
从左往右
${vara#*word}或${vara##*word}
其中word可以指定任意字符,从左往右,查找变量所存储的字符串中,第一次出现的word。删除字符串开头至第一次出现word字符之间的所有字符。注意:两个#号有区别。是删除的字符串开头至最后一次由word指定的字符之间的所有内容。
- 案例
拿掉第一条/及其左边的字串
[root@study102 sh]# echo $var
/dir1/dir2/dir3/my.file.txt
[root@study102 sh]# echo ${var#*/}
dir1/dir2/dir3/my.file.txt
- 案例
拿掉最后一条/及其左边的字串
[root@study102 sh]# echo $var
/dir1/dir2/dir3/my.file.txt
[root@study102 sh]# echo ${var##*/}
my.file.txt
从右往左
${var%*word}或${var%%*word}
其中word可以指定任意字符,从右往左,查找变量所存储的字符串中,第一次出现的word。删除字符串开头至第一次出现word字符之间的所有字符。注意:两个%号有区别。是删除的字符串开头至最后一次由word指定的字符之间的所有内容。
- 案例
拿掉最后条/及其右边的字串
[root@study102 sh]# echo $var
/dir1/dir2/dir3/my.file.txt
[root@study102 sh]# echo ${var%/*}
/dir1/dir2/dir3
- 案例
掉第一条/及其右边的字串
[root@study102 sh]# echo $var
/dir1/dir2/dir3/my.file.txt
[root@study102 sh]# echo ${var%%/*}
注意上边的四个案例中的*号代表的匹配到后左或右所有的字符串
记忆方法
# 是去掉左边(在键盘上#在$之左边)
% 是去掉右边(在键盘上%在$之右边)
单一符号是最小匹配,两个符号是最大匹配。
查找替换
一
查找var所表示的字符串中,第一次被pattern所匹配的字符串,以substi替换
${var/pattern/substi}
二
查找var所表示的字符串中,所有能被pattern所有匹配的字符串,以substi替换
${var//pattern/substi}
三
查找var所表示的字符串中,行首能被pattern所匹配的字符串,以substi替换
${var/#pattern/substi}
四
查找var所表示的字符串中,行尾能被pattern所匹配的字符串,以substi替换
${var/%pattern/substi}
查找并删除
一
查找var中所表示的字符串中,删除第一次被pattern所匹配的字符串。
${var/pattern}
二
查找var中所表示的字符串中。删除所有能被pattern匹配的字符串
${var//pattern}
三
查找var中所表示的字符串中,删除行首能被pattern匹配的字符串。
${var/#pattern}
四
查找var中所表示的字符串中,删除行尾能被pattern匹配的字符串
${var/%pattern}
字符大小写替换
一
把var中所有的小写字母替换成为大写
${var^^}
- 案例
[root@study102 sh]# echo ${var^^}
/DIR1/DIR2/DIR3/MY.FILE.TXT
二
把var中所有的大写字母替换成为小写
${var,,}
- 案例
[root@study102 sh]# var=/DIR1/DIR2/DIR3/MY.FILE.TXT
[root@study102 sh]# echo ${var,,}
/dir1/dir2/dir3/my.file.txt
变量赋值变化状态
赋值状态:
未设定(unset)、空值(null)、非空值(non-null)
- 第一种
${var-value}和${var:-value}
${var-value} 如果var没有设定,则使用value作为传回值。(空值及非空值时不做处理)
${var:-value} 如果var没有设定或为空值,则使用value作为传回值。(非空值时不做处理)
- 第二种
${var+value}和${var:+value}
${var+value} 如果var为空值或非空值,则使用value作为传回值。(没设定时不做处理)
${var:+value} 如果var为非空值,则使用value作为传回值。(没设定和空值时不做处理)
- 第三种
${var=value}和${var:=value}
${var=value} 如果var没设定,则使用value作为返回值,同时将$var赋值为value。(空值及非空值时不做处理)
${var:=value} 如果var没设定或为空值,则使用value作为回传值,同时将$var赋值为value。(非空值时不做处理)
- 第四种
${var?value}和${var:?value}
${var?value} 如果var没有设定,则将value输出至STDERR。(空值及非空值时不作处理)
${var:?value} 如果var没设定或为空值,则将value输出至STDERR。(非空值时不作处理)
为脚本文件添加配置文件
利用字符串的操作功能来完成,在/tmp/下创建hostname文件,文件中声明一个变量HOSTNAME=xiaozhen.com。在创建一个hostname.sh的脚本文件读取该文件。如下:
文件:
[root@study102 ~]# cat /tmp/hostname
HOSTNAME=xiaozhen.com
脚本:
[root@study102 sh]# cat hostname.sh
#!/bin/bash
#
[ -r /tmp/hostname ] && . /tmp/hostname
HOSTNAME=${HOSTNAME:-aa.com}
hostname ${HOSTNAME}
执行结果
[root@study102 sh]# sh hostname.sh
[root@study102 sh]# hostname
xiaozhen.com
脚本中如果变量HOSTNAME没有设定或为空值,会使用后边的aa.com赋值给变量。如果是非空值使用本身值。