linux ${} 字符串替换

文章目录

  • [linux ${} 字符串替换](#linux ${} 字符串替换)
    • [1. 字符串截取](#1. 字符串截取)
        • [:one: 删除第一个 / 及其左边所有的内容](#:one: 删除第一个 / 及其左边所有的内容)
        • [:two: 删除最后一个 / 及其左边所有的内容](#:two: 删除最后一个 / 及其左边所有的内容)
        • [:three: 删除第一个 . 及其左边所有的内容](#:three: 删除第一个 . 及其左边所有的内容)
        • [:four: 删除最后一个 . 及其左边所有的内容](#:four: 删除最后一个 . 及其左边所有的内容)
        • [:five: 删除最后一个 / 及其右边所有的内容](#:five: 删除最后一个 / 及其右边所有的内容)
        • [:six: 删除第一个 / 及其右边所有内容](#:six: 删除第一个 / 及其右边所有内容)
        • [:seven: 删除最后一个 . 及其右边所有的内容](#:seven: 删除最后一个 . 及其右边所有的内容)
        • [:eight: 删除第一个 . 及其右边所有的内容](#:eight: 删除第一个 . 及其右边所有的内容)
    • [2. 字符串切片](#2. 字符串切片)
        • [:one: 截取前5个字符](#:one: 截取前5个字符)
        • [:two: 截取最后5个字符](#:two: 截取最后5个字符)
        • [:three: 截取指定下标的内容](#:three: 截取指定下标的内容)
        • [:four: 截取最后一个字符](#:four: 截取最后一个字符)
        • [:five: 截取倒数5个字符](#:five: 截取倒数5个字符)
        • [:six: 截取倒数第5个字符开始的2个字符](#:six: 截取倒数第5个字符开始的2个字符)
    • [3. 字符串替换](#3. 字符串替换)
        • [:one: 匹配字符串替换](#:one: 匹配字符串替换)
        • [:two: 全部匹配替换](#:two: 全部匹配替换)
        • [:three: 使用正则匹配](#:three: 使用正则匹配)
        • [:four: 使用变量替换](#:four: 使用变量替换)
    • [4. 变量状态赋值](#4. 变量状态赋值)

linux ${} 字符串替换

1. 字符串截取

假设定义一个参数为 a=/a1/a2/a3/1.2.3.txt

1️⃣ 删除第一个 / 及其左边所有的内容

shell 复制代码
[root@node2 ~]# a=/a1/a2/a3/1.2.3.txt
[root@node2 ~]# echo ${a#*/}
a1/a2/a3/1.2.3.txt

# 或者
[root@node2 ~]# echo ${a#/*}
a1/a2/a3/1.2.3.txt

2️⃣ 删除最后一个 / 及其左边所有的内容

shell 复制代码
[root@node2 ~]# echo ${a##*/}
1.2.3.txt

3️⃣ 删除第一个 . 及其左边所有的内容

shell 复制代码
[root@node2 ~]# echo ${a#*.}
2.3.txt

4️⃣ 删除最后一个 . 及其左边所有的内容

shell 复制代码
[root@node2 ~]# echo ${a##*.}
txt

5️⃣ 删除最后一个 / 及其右边所有的内容

shell 复制代码
[root@node2 ~]# echo ${a%/*}
/a1/a2/a3

6️⃣ 删除第一个 / 及其右边所有内容

shell 复制代码
[root@node2 ~]# echo ${a%%/*}

# 这里得到的是一个空值

7️⃣ 删除最后一个 . 及其右边所有的内容

shell 复制代码
[root@node2 ~]# echo ${a%.*}
/a1/a2/a3/1.2.3

8️⃣ 删除第一个 . 及其右边所有的内容

shell 复制代码
[root@node2 ~]# echo ${a%%.*}
/a1/a2/a3/1

2. 字符串切片

格式:${a:\b:c}(注:这里使用 \b 是因为 makedown 格式中会将两个 : 之间的 b 变成一个符号)

解析:将字符串变量 a 从第 b 个位置开始向后截取 c 长度的字符。b 是下标(下标从 0 开始)
定义一个参数:aa="hello world"

1️⃣ 截取前5个字符

shell 复制代码
[root@node2 ~]# echo ${aa:0:5}
hello

2️⃣ 截取最后5个字符

shell 复制代码
[root@node2 ~]# echo ${aa:5}
world

3️⃣ 截取指定下标的内容

shell 复制代码
[root@node2 ~]# echo ${aa:6:5}
world

4️⃣ 截取最后一个字符

shell 复制代码
[root@node2 ~]# echo ${aa:(-1)}
d

5️⃣ 截取倒数5个字符

shell 复制代码
[root@node2 ~]# echo ${aa:(-5)}
world

6️⃣ 截取倒数第5个字符开始的2个字符

shell 复制代码
[root@node2 ~]# echo ${aa:(-5):2}
wo

3. 字符串替换

格式:${a/b/c}

解析:将变量a中的b全部替换为c,开头一个正斜杠为只匹配第一个字符串,两个正斜杠为匹配所有字符。
定义一个参数:aa="hello world world"

1️⃣ 匹配字符串替换

shell 复制代码
[root@node2 ~]# echo ${aa/world/tom}
hello tom world

2️⃣ 全部匹配替换

shell 复制代码
[root@node2 ~]# echo ${aa//world/tom}
hello tom tom

3️⃣ 使用正则匹配

定义一个参数:demo="123abc234$%"

shell 复制代码
# 匹配除了数字以外的所有内容,并替换成空
[root@node2 ~]# echo ${demo//[^0-9]/}
123234

# 匹配数字,并全部替换为空
[root@node2 ~]# echo ${demo//[0-9]/}
abc$%

# 匹配除数字以外的字符,并替换成 = (注:这里是单一替换,即一个字符替换一次)
[root@node2 ~]# echo ${demo//[^0-9]/=}
123===234==
# 这里是单个匹配
[root@node2 ~]# echo ${demo/[^0-9]/=}
123=bc234$%

# 匹配所有数字,并替换成指定内容
[root@node2 ~]# echo ${demo//[0-9]/=}
===abc===$%

4️⃣ 使用变量替换

定义一个参数:demo="1.1.1.1/aaa/bbb:tom.test.com"

修改需求:

​ 修改参数中 : 后的第一个参数的内容为 "xiaoming",即结果为 "1.1.1.1/aaa/bbb:xiaoming.test.com"

shell 复制代码
# 获取 : 后的参数内容 
demo="1.1.1.1/aaa/bbb:tom.test.com"
name=`echo $demo | awk -F':' '{print $2}' | awk -F'.' '{print $1}'`
echo ${demo/$name/xiaoming}

4. 变量状态赋值

定义一个参数 aa="hello tom"

shell 复制代码
# ${VAR:-string} 如果 VAR 变量不为空则返回 VAR
[root@node2 ~]# echo ${aa:-'hello world!'}
hello tom

# ${VAR:-string} 如果 VAR 变量为空则返回 string
[root@node2 ~]# echo ${bb:-'hello world!'}
hello world!

# ${VAR:-string} 如果 VAR 变量不为空则返回 string
[root@node2 ~]# echo ${aa:+'hello world!'}
hello world!

# ${VAR=string} 如果变量为空就重新赋值
[root@node2 ~]# echo ${aa:=123}
hello tom
[root@node2 ~]# echo ${bb:=123}
123

#如果变量为空就将信息输出 stderr:
[root@node2 ~]# echo ${aa:?value is null}
hello tom
[root@node2 ~]# echo ${BB:?value is null}
-bash: BB: value is null