一、变量置换

一 、${parameter:-word}   相当于默认值  !!!!!!!!!
若 parameter 为空或未设置,则用 word 代替 parameter 进行替换,parameter 的值不变

# echo $a

# echo ${a:-aaa}
aaa
# echo $a

# a=bbb
# echo ${a:-aaa}
bbb
# echo $a
bbb


二、${parameter:=word}  相当于默认值,并且把该值直接赋值给变量
若 parameter 为空或未设置,则 parameter 设为值 word
# unset a
# echo $a

# echo ${a:=aaa}
aaa
# echo $a
aaa
# a=bbb
# echo $a
bbb
# echo ${a:=aaa}
bbb
# echo $a
bbb


三 、${parameter:+word}
若 parameter 设置了,则用 word 代替 parameter 进行替换,parameter 的值不变
# unset a
# echo $a

# echo ${a:+aaa}

# a=bbb
# echo ${a:+aaa}
aaa
# echo $a
bbb


四、${parameter:?message}    变量缺失的报错提示信息
若 parameter 为空或未设置,则 message 作为标准错误打印出来,这可用来检查变量是否正确设置
# unset a

# echo ${a:?a的值为空,必须给一个值}
-bash: a: a的值为空,必须给一个值

# a=bbb
# echo ${a:?a的值为空,必须给一个值}
bbb

总结:
-                     变量的值为空,则替换,但是不进行赋值,再次调用还是为空
=                    变量的值为空,则替换并进行赋值,再次调用则为aaa
+                    变量的值设置了,但是会替换变量的值,但是不进行赋值,再次调用还是原来变量的值
?                   变量的值为空,就会报错提示信息

 

举例:
#! /bin/bash
read -p "请输入你的姓名:" name
read -p "请输入你的班级:" class
read -p "请输入你的年龄:" age
read -p "请输入你的性别:" sex

echo "姓名:${name:-zhangsan}"
echo "班级:${class:=class}"
echo "年龄:${age:+18}"
echo "性别:${sex:?这个变量没有设置}"

echo "姓名:$name"
echo "班级:$class"
echo "年龄:$age"
echo "性别:$sex"


执行:
# ./a.sh
请输入你的姓名:
请输入你的班级:
请输入你的年龄:20
# 如果变量sex不设置值的话,就会报提示信息
请输入你的性别:1


姓名:zhangsan
班级:class
年龄:18
性别:1


姓名:
班级:class
年龄:20
性别:1

二、变量内容的删除(切片)

切片 ${变量:num1}  num1起始位置  
切片 ${变量:num1:num2}  num1起始位置  num2长度

# a=123456123456
[root@controller ~]# echo $a
123456123456
[root@controller ~]# echo ${a:4}
56123456
[root@controller ~]# echo ${a:4:2}
56
[root@controller ~]# echo ${a:4:5}
56123
[root@controller ~]# echo ${a:4:10}
56123456

三、变量内容的切除和替换

${变量#关键词}        若变量内容从头开始的数据符合『关键词』,则将符合的最短数据切除 
${变量##关键词}                       若变量内容从头开始的数据符合『关键词』,则将符合的最长数据切除 
注意:要从头开始

${变量%关键词}                        若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据切除 
${变量%%关键词}                        若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据切除 
注意:结尾要写最后一位

${变量/旧字符串/新字符串}     若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串替代』
${变量//旧字符串/新字符串}     若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串替代』

# b=12345612345
[root@nfs script]# echo ${b#1*3}
45612345
[root@nfs script]# echo ${b##1*3}
45

# echo ${b%3*5}
12345612
# echo ${b%%3*5}
12

# echo $b
12345612345
# echo ${b/123/abc}
abc45612345
# echo ${b//123/abc}
abc456abc45

# b=1234512345123
# echo ${b//123/abc}
abc45abc45abc

练习:
# file=/dir1/dir2/dir3/my.file.txt 
${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt 
${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt 
${file#*.}:拿掉第一个 . 及其左边的字符串:file.txt 
${file##*.}:  拿掉最后一个 . 及其左边的字符串:txt 
${file%/*}:  拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3 
${file%%/*}: 拿掉第一条 / 及其右边的字符串:(空值) 
${file%.*}:  拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file 
${file%%.*}: 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my 

 

命令:dirname和basename
# c=/etc/sysconfig/network-scripts/ifcfg-ens33 

# dirname $c
/etc/sysconfig/network-scripts

# basename $c
ifcfg-ens33