linux ${} 字符串替换
1. 字符串截取
假设定义一个参数为 a=/a1/a2/a3/1.2.3.txt
1️⃣ 删除第一个 / 及其左边所有的内容
[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️⃣ 删除最后一个 / 及其左边所有的内容
[root@node2 ~]# echo ${a##*/}
1.2.3.txt
3️⃣ 删除第一个 . 及其左边所有的内容
[root@node2 ~]# echo ${a#*.}
2.3.txt
4️⃣ 删除最后一个 . 及其左边所有的内容
[root@node2 ~]# echo ${a##*.}
txt
5️⃣ 删除最后一个 / 及其右边所有的内容
[root@node2 ~]# echo ${a%/*}
/a1/a2/a3
6️⃣ 删除第一个 / 及其右边所有内容
[root@node2 ~]# echo ${a%%/*}
# 这里得到的是一个空值
7️⃣ 删除最后一个 . 及其右边所有的内容
[root@node2 ~]# echo ${a%.*}
/a1/a2/a3/1.2.3
8️⃣ 删除第一个 . 及其右边所有的内容
[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个字符
[root@node2 ~]# echo ${aa:0:5}
hello
2️⃣ 截取最后5个字符
[root@node2 ~]# echo ${aa:5}
world
3️⃣ 截取指定下标的内容
[root@node2 ~]# echo ${aa:6:5}
world
4️⃣ 截取最后一个字符
[root@node2 ~]# echo ${aa:(-1)}
d
5️⃣ 截取倒数5个字符
[root@node2 ~]# echo ${aa:(-5)}
world
6️⃣ 截取倒数第5个字符开始的2个字符
[root@node2 ~]# echo ${aa:(-5):2}
wo
3. 字符串替换
格式:${a/b/c}
解析:将变量a中的b全部替换为c,开头一个正斜杠为只匹配第一个字符串,两个正斜杠为匹配所有字符。
定义一个参数:aa=“hello world world”
1️⃣ 匹配字符串替换
[root@node2 ~]# echo ${aa/world/tom}
hello tom world
2️⃣ 全部匹配替换
[root@node2 ~]# echo ${aa//world/tom}
hello tom tom
3️⃣ 使用正则匹配
定义一个参数:demo=“123abc234$%”
# 匹配除了数字以外的所有内容,并替换成空
[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”
# 获取 : 后的参数内容
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”
# ${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