1. 程式人生 > >Shell特殊擴展變量的實踐

Shell特殊擴展變量的實踐

? = 特殊擴展變量     ${parameter:{- +}word}

博主名:李常明

博客地址: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特殊擴展變量的實踐