shell :=、 :+、 :-、 :? 变量扩展修饰符

变量扩展修饰符

我们可以用一些专用修饰符来测试和修改变量。修饰符首先提供一个简单的条件测试,用来检查某个变量是否已经被设置,然后根据测试结果给变量赋一个值。

变量修饰符

修饰符
${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 ~]# 
  1. 将变量 fruit 的值设为 peach。
  2. 这个专用修饰符将检查变量 fruit 是否已被设置。如果 fruit 已被设置,就显示它。否则,用 plum 替换 fruit, 并显示该值。
  3. 变量 newfruit 未曾被设置。值 apple 将暂时替换 newfruit。
  4. 上一行的设置是暂时的,因此,变量 newfruit 仍未被设置。
  5. 环境变量 EDITOR尚未被设置。
  6. 修饰符 :- 将 /bin/vi 替换为 EDITOR。
  7. EDITOR未曾被设置过,因此什么都不会打印。
  8. 变量 name 被设为空值。因为修饰符前面没有冒号,变量即使为空也被认为是设置过的,所以没有把新的值 Joe 赋给变量name。
  9. 冒号使得修饰符检查变量是否未设置或为空。只要是这两种情况之一,就用值 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 ~]# 
  1. 赋给变量 name 一个空值。
  2. 用修饰符 := 将检查变量 name 是否尚未被设置。如果已经被设置过了,就不会被改变。如果尚未设置或值为空,就将等号右边的值赋给它。由于之前已将变量 name 设置为空,所以现在要把 Peter 赋给它。这个设置是持久的。
  3. 变量 name 的值还是 Peter。
  4. 把变量 EDITOR 设置为 /bin/vi。
  5. 显示变量 EDITOR 的值。
1 [root@localhost ~]# foo=grapes
2 [root@localhost ~]# echo ${foo:+pears}
pears
3 [root@localhost ~]# echo $foo
grapes
[root@localhost ~]# 
  1. 将变量 foo 的值设置为 grapes。
  2. 专用修饰符 :+ 将检查变量 foo 是否已被设置。如果已经被设置过,就用 pears 暂时替换 foo。否则,返回空。
  3. 变量 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 ~]# 
  1. 修饰符 :?检查变量是否已被赋值。如果尚未设置该变量,就把问号右边的信息打印在标准错误输出上。如果此时是在执行脚本,就退出脚本。
  2. 如果问号后面没有提供报错信息,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 ~]#

说明:

  1. 给变量赋值notebook。
  2. var的子串从偏移0(notebook中的n)开始,长度为4个字符,在e处结束。
  3. var的子串从偏移4(notebook中的b)开始,长度为4个字符,在k处结束。
  4. var的子串从偏移0(notebook中的n)开始,长度为2个字符,在o处结束。
  5. var的子串从偏移-4(notebook中的b)开始,长度为4个字符,在k处结束。
  6. var的子串从偏移-4(notebook中的b)开始,长度为2个字符,在o处结束。

注意:请不要将变量扩展修饰符( :=、 :+、 :-、 :?)与makefile赋值混淆:
makefile四种赋值方式:
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值