bash之字符串处理(核心重点)

字符串切片

格式

${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赋值给变量。如果是非空值使用本身值。

原文地址:https://www.cnblogs.com/Liuxz/p/13237403.html