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