Shell特殊扩展变量的实践

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell特殊扩展变量的实践相关的知识,希望对你有一定的参考价值。

博主名:李常明

博客地址:http://keep88.blog.51cto.com


此笔记出自老男孩书籍:跟老男孩学linux运维  shell编程实战

特殊扩展变量

1、${parameter:-word}功能实践

${parameter:-word}的作用是如果parameter变量值为空或未赋值,则会返回word字符串替代变量的值

例如:

[[email protected] ~]# echo $test    #>==   此时test变量未赋值

[[email protected] ~]# echo ${test:-word}      #>==  可以看到test变量未赋值,输出了 word,表明test变量为空,返回 “-”后面定义的字符,但是需注意 不会将word赋值给test变量,只是一个标识。
word
[[email protected] ~]# test="abc"    #>==  将test变量赋值 abc,查看输出结果
[[email protected] ~]# echo $test
abc
[[email protected] ~]# echo ${test:-word}   #>==  此时test变量有赋值,所以输出了test变量的值。
abc
[[email protected] ~]#

注释:

  ${parameter:-word} 中的冒号“:”是可以省去的。与上述结果无区别


2、${parameter:=word}功能实践:

判断parameter的变量是否有值,如果有值输出变量的值,如果未赋值,则将“-”后面的字符 word(自定义的)赋值给parameter变量

例如:

[[email protected] ~]# unset test
[[email protected] ~]# echo $test  #>==  test变量未赋值

[[email protected] ~]# A=${test:=word}
[[email protected] ~]# echo $A     #>==   未赋值,则将word赋值给变量test
word

如果test变量有赋值,则直接输出test的变量
[[email protected] ~]# test="5678"
[[email protected] ~]# echo $test
5678
[[email protected] ~]# B=${test:=word}
[[email protected] ~]# echo $B   #>==  test变量有赋值,直接输出值,不会将word赋值给$test
5678


以上两个特殊变量的区别:

  ${parameter:-word}: 如果parameter有赋值,输出值,无赋值,输出"-"后定义的字符,不会赋值给变量parameter,只是显示信息

  ${parameter:=word}: 如果parameter有赋值,输出值,无赋值,将"="后定义的字符,赋值给变量parameter

3、${parameter:?word}功能实践:

  如果parameter变量未赋值,则提示错误信息为"?"后定义的字符,如果已赋值,则直接输出值

例如:

[[email protected] ~]# unset test   #>==  取消test变量的赋值
[[email protected] ~]# echo ${test:? is not value}
-bash: test:  is not value    #>==  可以看到,未赋值情况下,输出了? 后定义的错误信息

如果有赋值呢?查看结果:

[[email protected] ~]# test="abcdefg"   #>==   给test变量赋值
[[email protected] ~]# echo $test
abcdefg

[[email protected] ~]# echo ${test:? test  is not have value}
abcdefg    #>==   test变量有值的情况下,直接输出了值


4、${parameter:+word}功能实践

如果parameter未赋值,则输出空,如果parameter变量有赋值,则输出+ 后定义的信息,但是不会赋值给parameter变量


例如:

[[email protected] ~]# unset test
[[email protected] ~]# echo $test 

[[email protected] ~]# echo ${test:+word}       #>==  test变量为赋值,输出了空

[[email protected] ~]# test=aaaaaaa
[[email protected] ~]# echo ${test:+word}  #>==  输出word,说明test变量有赋值,但不会将word赋值给test,只是输出信息,用于提示
word
[[email protected] ~]# echo $test   #>==  test变量还是最初定义的值
aaaaaaa


生产案例:

  删除7天前的过期数据备份

    如果忘记了定义path变量,又不希望path值为空值,就可以定义/tmp替代path空值的返回值,

例如:

[[email protected] ~]# cat delete.sh 
find ${path- /tmp} -name *.tar.gz -type f -mtime +7 | xargs rm -f

[[email protected] ~]# sh -x delete.sh 
+ xargs rm -f
+ find /tmp -name ‘*.tar.gz‘ -type f -mtime +7

如果path变量未设置,未空,则返回下列内容:
[[email protected] ~]# cat delete.sh 
find ${path} -name *.tar.gz -type f -mtime +7 | xargs rm -f
[[email protected] ~]# sh -x delete.sh 
+ xargs rm -f
+ find -name ‘*.tar.gz‘ -type f -mtime +7  #>==  此时执行脚本,就会报错



本文出自 “keep常明” 博客,请务必保留此出处http://keep88.blog.51cto.com/11829099/1932538

以上是关于Shell特殊扩展变量的实践的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程-03-Shell中的特殊变量和扩展变量

Linux bash基础特性二

Bash的变量类型

Linux Bash Shell学习笔记

提供跟老男孩学Linux运维Shell编程实战的第第五章源代码

Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数