天天看點

shell 程式設計:冒号 後面跟 等号,加号,減号,問号的意義預設值(:-)指定預設值(:=)變量是否存在檢查(:?)覆寫預設值(:+)替換部分字元串(:n)根據模闆删除字串(%,#,%%,##)使用模闆進行子字元串的替換(//)

預設值(:-)

如果變量後面跟着冒号和減号,則變量後面跟着是這個變量的預設值。

$ COMPANY=

$ printf “%s/n” “${COMPANY:-Unknown Company}”

Unknown Company

變量的實際值可以保持不變。

冒号也可以省略掉不用:

$ COMPANY=

$ printf “%s/n” “${COMPANY-Nightlight Inc.}”

$

指定預設值(:=)

如果變量後面跟着冒号和等号,則給空變量指定一個預設值。

$ printf “%s/n” “${COMPANY:=Nightlight Inc.}”

Nightlight Inc.

$ printf “%s/n” “$COMPANY”

Nightlight Inc.

變量的實際值已經改變了。

去除冒号,則不會指定預設值。

變量是否存在檢查(:?)

如果變量後面跟着冒号和問号,則根據變量是否存在,顯示不同的資訊。資訊不是必選的。

printf “Company is %s/n” /

“${COMPANY:?Error: Company has notbeen defined—aborting}”

如果沒有冒号則不會進行檢查。

覆寫預設值(:+)

如果變量後面跟着冒号和加号,則加好後面的字元串替換預設字元串。

$ COMPANY=”Nightlight Inc.”

$ printf “%s/n” “${COMPANY:+Company has been overridden}”

Company has been overridden

如果沒有冒号,變量也被字元串所替換,變量本身的值不改變。

替換部分字元串(:n)

如果變量後面跟着一個冒号和數字,則傳回該數字開始的一個子字元串,如果後面還跟着一個冒号和數字。則第一個數字表示開始的字元,後面數字表示字元的長度。

$ printf “%s/n” “${COMPANY:5}”

light Inc.

$ printf “%s/n” “${COMPANY:5:5}”

light

根據模闆删除字串(%,#,%%,##)

如果變量後面跟着井号,則傳回比對模闆被删除後的字串。一個井号為最小可能性的比對,兩個井号為自大可能性的比對。表達式傳回模闆右邊的字元。

$ printf “%s/n” “${COMPANY#Ni*}”

ghtlight Inc.

$ printf “%s/n” “${COMPANY##Ni*}”

$ printf “%s/n” “${COMPANY##*t}”

Inc.

$ printf “%s/n” “${COMPANY#*t}”

light Inc.

使用百分号,表達式傳回模闆左邊的字元

$ printf “%s/n” “${COMPANY%t*}”

Nightligh

$ printf “%s/n” “${COMPANY%%t*}”

Nigh

(在我的Linux系統中上述指令不起取用)

使用模闆進行子字元串的替換(//)

如果變量後隻有一個斜杠,則兩個斜杠中間的字元串是要被替換的字元串,而第二個斜杠後面的字元串是要替換的字元串。如果變量後面跟着兩個斜杠,則所有出現在兩個斜杠中間的字元都要被替換為最後一個斜杠後面的字元。

$ printf “%s/n” “${COMPANY/Inc./Incorporated}”

Nightlight Incorporated

$ printf “You are the I in %s” “${COMPANY//i/I}”

You are the I in NIghtlIght Inc.

如果模闆一#号開始,則比對以模闆開始的字元,如果模闆以%号結尾,則比對以模闆結尾的字元。

$ COMPANY=”NightLight Night Lighting Inc.”

$ printf “%s/n” “$COMPANY”

NightLight Night Lighting Inc.

$ printf “%s” “${COMPANY//Night/NIGHT}”

NIGHTLight NIGHT Lighting Inc.

$ printf “%s” “${COMPANY//#Night/NIGHT}”

NIGHTLight Night Lighting Inc.

(我的Linux中這個不起作用)

如果沒有指定新的值,則比對的字元會被删除。

$ COMPANY=”Nightlight Inc.”

$ printf “%s/n” “${COMPANY/light}”

Night Inc.

也可以使用範圍符号。例如:删除所有字元串中的标點符号,使用範圍[:punct:]。

$ printf “%s” “${COMPANY//[[:punct:]]}”

Nightlight Inc

使用星号或@符号替換變量會替換外殼腳本中所有的參數,同樣,在數組中使用星号或@符号也會替換數組中的所有元素

繼續閱讀