shell中變量的替換
Bash Shell可以進行變量的條件替換,既只有某種條件發生時才進行替換,替換 條件放在{}中。
1、${value:-word}
當變量未定義或者值爲空時,返回值爲word的內容,否則返回變量的值.
例1:
[root@master ~]# echo ${a:-123} #變量a未定義返回了123
123
[root@master ~]# a=10 && echo ${a:-123} #定義變量a=10,返回10
10
2、${value:=word}
與前者類似,只是若變量未定義或者值爲空時,在返回word的值的同時將word賦值給value
例2:
[root@master ~]# echo ${b:=20} #變量b未定義,返回20並把值賦給b
20
[root@master ~]# echo $b #可以看到,現在變量b的值爲20
20
3、${value:?message}
若變量已賦值的話,正常輸出變量的值.否則將消息message送到標準錯誤輸出(若 此替換出現在Shell程序中,那麼該程序將終止運行)
例3:
#c變量沒有定義就會終止程序並輸出後面設置好的提示信息
[root@master ~]# echo ${c:?變量未定義或者未賦值}
-bash: c: 變量未定義或者未賦值
#變量定義了,就會輸出變量的值
[root@master ~]# c=10 && echo ${c:?變量未定義或者未賦值}
10
4、${value:+word}
若變量已賦值的話,其值才用word替換,否則不進行任何替換
例4:
[root@master ~]# echo ${d:+12} #可以看到變量d未賦值沒有進行替換
[root@master ~]# d=10 && echo ${d:+12} #給變量d賦值後進行了替換
12
5、${value:offset}
${value:offset:length}
從變量中提取子串,這裏offset和length可以是算術表達式.,offset代表偏移量,從第幾個字符開始提取,length是需要提取的字符串的個數。
例5:
[root@master ~]# e=abcdefghijk && echo ${e:3:2} #從第3個字符後面開始提取2個字符
de
[root@master ~]# e=abcdefghijk && echo ${e:5:6} #從第5個字符後面開始提取6個字符
fghijk
6、 ${#value}
變量的字符個數
例6:
[root@master ~]# f=abcde && echo ${#f} #計算變量f的字符個數
5
7、${value#pattern} 和 ${value##pattern}
去掉value中與pattern相匹配的部分,條件是value的開頭與pattern相匹配 #與##的區別在於一個是最短匹配模式,一個是最長匹配模式.
例7:
[root@master ~]# g="hehello heworld" && echo ${g##he}
hello heworld
[root@master ~]# g="hehello heworld" && echo ${g#he}
hello heworld
[root@master ~]# g="hehello heworld" && echo ${g##heworld}
hehello heworld
[root@master ~]# g="hehello heworld" && echo ${g#hehello}
heworld
實驗證明${value#pattern} 和 ${value##pattern}沒有太大區別,都只能從開頭匹配,而且都只能匹配一次。
8、${value%pattern} 和${value%%pattern}
和上面的例7類似,只是是從value的尾部和pattern相匹配,%與%%的區別與#與##一樣
例8:
[root@master ~]# h="hehello heworld" && echo ${g%heworld}
hehello
[root@master ~]# h="hehello heworld" && echo ${g%he}
hehello heworld
[root@master ~]# h="hehello heworld" && echo ${g%%he}
hehello heworld
[root@master ~]# h="hehello heworld" && echo ${g%%ld}
hehello hewor
實驗證明${value%pattern} 和 ${value%%pattern}沒有太大區別,都只能從結尾匹配,而且都只能匹配一次。
9、${value/pattern/string} 和${value//pattern/string}
進行變量內容的替換,把與pattern匹配的部分替換爲string的內容,’/’與’//’的區別是’/’只進行一次匹配替換,而’//’可以進行多次匹配替換。
例9:
[root@master ~]# i="hello world" && echo ${i/wo/aa} #這裏把wo替換成爲aa
hello aarld
[root@master ~]# i="hello world" && echo ${i/o/b} #這裏把一個o替換成爲b
hellb world
[root@master ~]# i="hello world" && echo ${i//o/b} #這裏把兩個o都替換成爲b
hellb wbrld