文章目录
- [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