shell 變量替換

1,參數替換:

 

                   不含有“:”的,只要定義了,就生效,不管是否爲空

                   含有“:”的,即使定義了,但是爲空就不生效

                   用來替換的內容可以是字符串、一個變量、命令的輸出

                   被替換的內容是變量,如$a$1

 

         1)默認值替換,如果變量$var沒有定義,則整體值爲default字符串,但var變量本身並沒有被設置:

                   ${var-default}                    如果var定義了,但爲空,則還使用$var,即爲空

                   ${var:-default}          如果var定義了,但爲空,則使用default字符串

                   例如(以下例子爲順序執行):

                   [root@fx_local2 ~]# unset a

                   [root@fx_local2 ~]# unset b

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# a=                      # 定義了$a,但爲空

                   [root@fx_local2 ~]# echo ${a-CBA}          # 用字符串CBA替換$a

                                                                 # 沒有被替換,輸出空,因爲$a爲空

                   [root@fx_local2 ~]# echo ${a:-CBA}

                   CBA                                       # 已經被替換,沒有輸出空,使用了CBA來替換

                   [root@fx_local2 ~]# echo $a            # 看一下$a的值是否被設置

                                                                 # 還是空,因爲$a本身並沒有被設置

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# unset a             # 刪除$a

                   [root@fx_local2 ~]# echo ${a:-CBA}

                   CBA

                   [root@fx_local2 ~]# echo ${a-CBA}

                   CBA

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# b=CCC

                   [root@fx_local2 ~]# echo ${a-$b} # 用變量$b替換$a

                   CCC

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${a-$(pwd)}     # 用命令pwd替換$a

                   /root

                   #--------------------------------------------------------------------------------#

                   或者在腳本中使用:${1-deault}

         2)默認值設置,包含默認值替換的所有功能(標準輸出一樣),不同在於,如果變量$var沒有定義,則在輸出default字符串的同時,$var也被設置成default字符串

                   ${var=default}           如果var定義了,但爲空,則還使用$var,即爲空

                   ${var:=default}                   如果var定義了,但爲空,則將$var設置成default字符串

 

                   例如:

                   [root@fx_local2 ~]# unset a

                   [root@fx_local2 ~]# unset b

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# a=ABC

                   [root@fx_local2 ~]# echo ${a=CBA}

                   ABC

                   [root@fx_local2 ~]# echo $a

                   ABC

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${b=CBA}       # $b沒有值

                   CBA                                       # 則輸出CBA,即被替換的值

                   [root@fx_local2 ~]# echo $b

                   CBA                                       # 並且$b的值也被設置成了CBA

 

         3)已有變量替換(並非設置),和默認值替換相反

                   ${var+new_var}

                   ${var:+new_var}

                   例如:

                   [root@fx_local2 ~]# unset a

                   [root@fx_local2 ~]# unset b

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# a=ABC             # 定義了$a

                   [root@fx_local2 ~]# echo ${a+CBA}

                   CBA                                       # 整體輸出了CBA,被替換的值

                   [root@fx_local2 ~]# echo $a

                   ABC                                       # $a本身並沒有被設置

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${b+CBA}         # $b是一個不存在的變量

                                                                 # 輸出空

                   [root@fx_local2 ~]# echo $b

                                                                 # 輸出空,證明$b本身沒有被設置

 

         4)標準錯誤替換,當變量沒有定義的時候,輸出標準錯誤

                   ${a?}

                   ${a?:}

                   ${a?AAA} AAA爲作爲標準錯誤輸出的內容

                   ${a?:AAA}

 

                   例如:

                   [root@fx_local2 ~]# unset a

                   [root@fx_local2 ~]# unset b

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# a=pwd

                   [root@fx_local2 ~]# echo ${a?}

                   pwd

                   [root@fx_local2 ~]# ${a}

                   /root

                   [root@fx_local2 ~]# ${a?}

                   /root

                   [root@fx_local2 ~]# : ${a?}               # 空命令後面跟${a?},則無標準輸出

                   [root@fx_local2 ~]# echo $?

                   0                                            # 此時狀態值爲0,表示$a有值

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# ${b?}

                   -bash: b: parameter null or not set

                   [root@fx_local2 ~]# : ${b?}

                   -bash: b: parameter null or not set

                   [root@fx_local2 ~]# echo ${b?}

                   -bash: b: parameter null or not set

                   [root@fx_local2 ~]# (${b?}) >/dev/null 2>&1

                   [root@fx_local2 ~]# echo $?

                   1                                            # 以上這些的狀態值都是1

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# ${b?AAA}

                   -bash: b: AAA                               # 錯誤信息變成了AAA

                   #--------------------------------------------------------------------------------#

                   或者一種靈活的用法:

                   ${1?"Usage: $0 ARGUMENT"}

 

 

         2,字符串匹配處理:

 

         1)字符串長度:

                   ${#var}     表示$var的長度

                   ${#2}         表示腳本的第二個參數的長度

                   ${#@}       表示腳本的所有參數的個數,等效於$#

                   另外,數組中某個元素的長度 ${#array[n]}

 

         2)字符串的前後截取,pattern一般是個命令行glob,匹配的即爲被去掉的字符:

                   ${var#pattern}                   最短頭匹配截取

                   ${var##Pattern}                 最大頭匹配截取

                   ${var%Pattern}                  最短尾匹配截取

                   ${var%%Pattern}               最大尾匹配截取

 

                   例如:

 

                   [root@fx_local2 ABS]# unset a

                   [root@fx_local2 ABS]# a=AAABBBCCC

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ABS]# echo $a

                   AAABBBCCC

                   [root@fx_local2 ABS]# echo ${a#A}         # 並沒有用glob,從頭去掉一個“A

                   AABBBCCC

                   [root@fx_local2 ABS]# echo ${a#AA}

                   ABBBCCC

                   [root@fx_local2 ABS]# echo ${a#AAA}

                   BBBCCC

                   [root@fx_local2 ABS]# echo ${a##AAA}

                   BBBCCC                                        # 以上在沒有glob的時候,###是相同的

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ABS]# echo ${a%CC}     # 從尾去掉兩個“C”(或者說一個“CC”)

                   AAABBBC

                   [root@fx_local2 ABS]# echo ${a%%BBCCC}

                   AAAB                                             # %%%的原理同上一樣

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ABS]# echo ${a#BB}

                   AAABBBCCC                                # 本是從頭,但字符在中間就不行了

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ABS]# echo ${a##*A}    # 這裏用到了glob

                   BBBCCC                                        # 因爲是最大頭匹配,所以其中*A等效於AAA

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ABS]# a=/home/wwy/bin/ABS/zero.sh                  

                   [root@fx_local2 ABS]# echo ${a%.*}       # 匹配右邊數第一個“.”右邊的字符

                   /home/wwy/bin/ABS/zero

                   [root@fx_local2 ABS]# echo ${a%%.*}

                   /home/wwy/bin/ABS/zero                          # 因爲只有一個“.”,所以%%%是一樣的

                   [root@fx_local2 ABS]# echo ${a#*.}        # 匹配左邊數第一個“.”左邊的字符

                   sh

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ABS]# echo ${a%/*}     # 最短尾匹配,從右往左看

                   /home/wwy/bin/ABS                          # /* 即爲從右往左看的第一個/的右邊

                   [root@fx_local2 ABS]# echo ${a##*/}     # 最長頭匹配,從左往右看

                   zero.sh                                          # */ 即爲從左往右看的最後一個/的左邊

 

         3)字符串位置,postion爲第幾個位置,此位置前面的字符爲被匹配的(被刪除的),length表示剩下的字符的長度:

                   ${var:postion}  # 從左往右看,匹配postion位置之左的,留下之後的

                   ${var:(-postion)} # 從右往左看,匹配postion位置之左的,()是爲了避免和${var-default}衝突

                   ${var:postion:length} # 匹配postion位置之前的同時,顯示之後的長度爲length

                  

                   例如:

                   [root@fx_local2 ~]# unset a

                   [root@fx_local2 ~]# a=123456789

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${a:5}

                   6789                                               # 第五個字符之前的被刪除了(被匹配)

                   [root@fx_local2 ~]# echo ${a:(-2)}

                   89                                          # 倒數第二個字符之前的被刪除了(被匹配)

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${a:5:2} 

                   67                                          # 刪除之後,只輸出了剩下的前兩位

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${a:5:0}

                                                                 # 這樣就什麼都不剩了

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${a:5:1}

                   6                                            # 只剩下第一個,此方法即,顯示第五個字符

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# b=3

                   [root@fx_local2 ~]# echo ${a:`echo 5`:$b}      # 也可以這樣     

                   678

                  

         4)字符串替換,分第一個替換和全局替換,前綴替換後綴替換,同樣支持glob

                   ${var/Pattern/Replacement}            # 第一次匹配的被替換,類似:sed 's/Pattern/Replacement/'

                   ${var//Pattern/Replacement}          # 全局的匹配被替換,類似:sed 's/Pattern/Replacement/g'

                   ${var#/prefix/Replacement}             # 前綴替換

                   ${var%/suffix/Replacement}             # 後綴替換

 

                   例如:

                   [root@fx_local2 ~]# unset a

                   [root@fx_local2 ~]# a=ABCxxABC

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${a/x/X}  # 等效於:sed 's/x/X/'  <<<$a

                   ABCXxABC

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${a//x/X}          # 等效於:sed 's/x/X/g' <<<$a

                   ABCXXABC

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${a/#ABC/ZZZ}

                   ZZZxxABC                                     # 前面的ABC被替換

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${a/%ABC/ZZZ}

                   ABCxxZZZ                                     # 後面的ABC被替換

 

         5)得到變量名,輸出所有前綴一樣的變量名,不支持glob

                  ${!var_prefix*} ${!var_prefix@}

                  

                   例如:

                   [root@fx_local2 ~]# xyz111=something # 第一兩個變量,值隨意

                   [root@fx_local2 ~]# xyz222=something

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# echo ${!xyz*}  # 輸出所有xyz爲前綴的變量名

                   xyz111 xyz222

                   [root@fx_local2 ~]# echo ${!xyz@}         # 同樣的效果

                   xyz111 xyz222

                   #--------------------------------------------------------------------------------#

                   [root@fx_local2 ~]# Axyz333=somthing

                   [root@fx_local2 ~]# echo ${!xyz@}  

                   xyz111 xyz222                             # Axyz並沒有輸出

                   [root@fx_local2 ~]# echo ${!Axyz@}       # 應該這樣

                   Axyz333

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章