变量扩展修饰符
我们可以用一些专用修饰符来测试和修改变量。修饰符首先提供一个简单的条件测试,用来检查某个变量是否已经被设置,然后根据测试结果给变量赋一个值。
变量修饰符
修饰符 | 值 |
---|---|
${variable:-word} | 如果变量variable已被设置且非空,则代入它的值。否则,代入word |
${variable:=word} | 已被设置且值非空,就代入它的值。否则,将variable的值设为word。始终代入variable的值。位置参量不能用这种方式赋值 |
${variable:+word} | 如果变量variable已被设置且值非空,代入word。否则,什么都不代入(代入空值) |
${variable:?word} | 如果变量variable已被设置且值非空,就代入它的值。否则,输出word并且从shell退出。如果省略了word,就会显示信息:parameter null or not set |
${variable:offset} | 获得变量variable值中位置从offset开始的子串,偏移为从0到串的末尾 |
${variable:offset:length} | 获得变量variable值中位置从offset开始长度为length的子串 |
和冒号配合使用时,修饰符(-、=、+、?)检查变量是否尚未赋值或值为空。不加冒号时,值为空的变量也被认为已设置。
注意:offset偏移为负数时,表示方向从右往左计算偏移量。
一、使用例子
1 [root@localhost ~]# fruit=peach
2 [root@localhost ~]# echo ${fruit:-plum}
peach
3 [root@localhost ~]# echo ${newfruit:-apple}
apple
4 [root@localhost ~]# echo $newfruit
5 [root@localhost ~]# echo $EDITOR
6 [root@localhost ~]# echo ${EDITOR:-/bin/vi}
/bin/vi
7 [root@localhost ~]# echo $EDITOR
8 [root@localhost ~]# name=
[root@localhost ~]# echo ${name-Joe}
9 [root@localhost ~]# echo ${name:-Joe}
Joe
[root@localhost ~]#
- 将变量 fruit 的值设为 peach。
- 这个专用修饰符将检查变量 fruit 是否已被设置。如果 fruit 已被设置,就显示它。否则,用 plum 替换 fruit, 并显示该值。
- 变量 newfruit 未曾被设置。值 apple 将暂时替换 newfruit。
- 上一行的设置是暂时的,因此,变量 newfruit 仍未被设置。
- 环境变量 EDITOR尚未被设置。
- 修饰符 :- 将 /bin/vi 替换为 EDITOR。
- EDITOR未曾被设置过,因此什么都不会打印。
- 变量 name 被设为空值。因为修饰符前面没有冒号,变量即使为空也被认为是设置过的,所以没有把新的值 Joe 赋给变量name。
- 冒号使得修饰符检查变量是否未设置或为空。只要是这两种情况之一,就用值 Joe 替换 name。
1 [root@localhost ~]# name=
2 [root@localhost ~]# echo ${name:=Peter}
Peter
3 [root@localhost ~]# echo $name
Peter
[root@localhost ~]# echo $EDITOR
4 [root@localhost ~]# echo ${EDITOR:=/bin/vi}
/bin/vi
5 [root@localhost ~]# echo $EDITOR
/bin/vi
[root@localhost ~]#
- 赋给变量 name 一个空值。
- 用修饰符 := 将检查变量 name 是否尚未被设置。如果已经被设置过了,就不会被改变。如果尚未设置或值为空,就将等号右边的值赋给它。由于之前已将变量 name 设置为空,所以现在要把 Peter 赋给它。这个设置是持久的。
- 变量 name 的值还是 Peter。
- 把变量 EDITOR 设置为 /bin/vi。
- 显示变量 EDITOR 的值。
1 [root@localhost ~]# foo=grapes
2 [root@localhost ~]# echo ${foo:+pears}
pears
3 [root@localhost ~]# echo $foo
grapes
[root@localhost ~]#
- 将变量 foo 的值设置为 grapes。
- 专用修饰符 :+ 将检查变量 foo 是否已被设置。如果已经被设置过,就用 pears 暂时替换 foo。否则,返回空。
- 变量 foo 的值还是原来的值。
[root@localhost ~]# namex=
1 [root@localhost ~]# echo ${namex:?"namex is undefined"}
-bash: namex: namex is undefined
2 [root@localhost ~]# echo ${y?}
-bash: y: parameter null or not set
[root@localhost ~]#
- 修饰符 :?检查变量是否已被赋值。如果尚未设置该变量,就把问号右边的信息打印在标准错误输出上。如果此时是在执行脚本,就退出脚本。
- 如果问号后面没有提供报错信息,shell 就向标准错误输出发送默认的消息。
1 [root@localhost ~]# var=notebook
2 [root@localhost ~]# echo ${var:0:4}
note
3 [root@localhost ~]# echo ${var:4:4}
book
4 [root@localhost ~]# echo ${var:0:2}
no
[root@localhost ~]# echo ${var:0-4:4}
book
[root@localhost ~]# echo ${var:0-4:2}
bo
[root@localhost ~]#
说明:
- 给变量赋值notebook。
- var的子串从偏移0(notebook中的n)开始,长度为4个字符,在e处结束。
- var的子串从偏移4(notebook中的b)开始,长度为4个字符,在k处结束。
- var的子串从偏移0(notebook中的n)开始,长度为2个字符,在o处结束。
- var的子串从偏移-4(notebook中的b)开始,长度为4个字符,在k处结束。
- var的子串从偏移-4(notebook中的b)开始,长度为2个字符,在o处结束。
注意:请不要将变量扩展修饰符( :=、 :+、 :-、 :?)与makefile赋值混淆:
makefile四种赋值方式:
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值