shell腳本變量處理和擴(kuò)展
變量的類型
局部變量
局部變量只在代碼塊或一個(gè)函數(shù)里有效
如果變量用local來聲明,那么它只能在該變量聲明的代碼塊(block of code)中可見。這個(gè)代碼塊就是局部"范圍"。 在一個(gè)函數(shù)內(nèi),局部變量意味著只能在函數(shù)代碼塊內(nèi)它才有意義。
例如如下代碼:
#!/bin/bash
para1='a'
function func(){
local para2='b'
echo "para1:${para1}"
echo "para2:${para2}"
}
func
echo "para1:${para1}"
echo "para2:${para2}"
輸出為:
para1:a
para2:b
para1:a
para2:
變量的聲明
declare或typeset內(nèi)建命令(它們是完全相同的)可以用來限定變量的屬性.這是在某些編程語言中使用的定義類型不嚴(yán)格的方式。命令declare是bash版本2之后才有的。命令typeset也可以在ksh腳本中運(yùn)行。
-r只讀
declare -r var等同于readonly var
-i整數(shù)
將變量認(rèn)為是整數(shù)
例如:
n=6/3
echo $n
declare -i n
n=6/3
echo $n
輸出為:
6/3
2
-a數(shù)組
-f函數(shù)
在腳本中沒有帶任何參數(shù)的declare -f 會列出所有在此腳本前面已定義的函數(shù)出來。而declare -f function_name則只會列出指定的函數(shù)。
例如:
function abcd(){
echo abcd
}
function cdef(){
echo cdef
}
declare -f
echo
declare -f abcd
輸出為:
abcd ()
{
echo aaa
}
cdef ()
{
echo cdef
}
abcd ()
{
echo aaa
}
-F函數(shù)
顯示所有的自定義函數(shù)的名稱
例如上述例子:
declare -F
輸出為:
declare -f abcd
declare -f cdef
-x export
這樣將聲明一個(gè)變量作為腳本的環(huán)境變量而被導(dǎo)出。
類似的用法有:
declare -x var
typeset -x var
export var
-p 變量
類似-f選項(xiàng)。不傳參數(shù)會顯示所有的變量的值。傳參數(shù)只會顯示對應(yīng)的變量的值。
常用變量使用方法
${parameter}
運(yùn)行如下腳本:
#!/bin/bash
para='a'
echo ${para}
運(yùn)行結(jié)果為:
a
其中para是腳本的變量。也可以簡寫為$para的形式,但是在某種情況下可能會引起歧義。
在一個(gè)雙引號(" ")里的變量引用不會禁止變量替換。所以雙引號被稱為部分引用,有時(shí)也稱為"弱引用"。而在一個(gè)單引號里(' ')的變量替換是被禁止的,變量名只被解釋為普通的字面意思。所以單引號被稱為"全局引用",有時(shí)也被稱為強(qiáng)引用。
未初始化的變量又一個(gè)空的值(null)但是在算術(shù)運(yùn)算中會按照0來計(jì)算。
Bash不以"類型"來區(qū)分變量。本質(zhì)上來說,Bash變量是字符串,但是根據(jù)環(huán)境的不同,Bash允許變量有整數(shù)計(jì)算和比較。其中的決定因素是變量的值是不是只含有數(shù)字。
${parameter-default}, ${parameter:-default}
如果變量沒有被設(shè)置,使用默認(rèn)值。它們之間的差別是:當(dāng)一個(gè)參數(shù)已被聲明,但是值是NULL的時(shí)候兩者不同。
例如:
#!/bin/bash
echo a:${a-'a'}
echo a:${a}
a=
echo a:${a-'a'}
echo a:${a}
echo b:${b:-'b'}
echo b:$
b=
echo b:${b:-'b'}
echo b:$
a:a
a:
a:
a:
b:b
b:
b:b
b:
${parameter=default}, ${parameter:=default}
如果變量parameter沒有設(shè)置,把它設(shè)置成默認(rèn)值.
兩種形式幾乎相同,只是和上面的一樣,只有當(dāng)$parameter變量被聲明且被設(shè)置成null值時(shí)不同
${parameter+alt_value}, ${parameter:+alt_value}
如果變量parameter設(shè)置,使用alt_value作為新值,否則使用空字符串。
除了引起的當(dāng)變量被聲明且值是空值時(shí)有些不同外,兩種形式幾乎相等。
例如:
#!/bin/bash
echo a:${a+'a'}
a=
echo a:${a+'a'}
echo b:${b:+'b'}
b=
echo b:${b:+'b'}
echo a:${a+'a'}
a=qqqqqqq
echo a:${a+'a'}
echo b:${b:+'b'}
b=qqqqqqq
echo b:${b:+'b'}
運(yùn)行結(jié)果為:
a:
a:a
b:
b:
a:a
a:a
b:
b:b
${parameter?err_msg}, ${parameter:?err_msg}
如果變量parameter已經(jīng)設(shè)置,則使用該值,否則打印err_msg錯(cuò)誤信息。
通??梢杂糜趨?shù)檢查。
: ${qwe?"qwe doesnot exit"}
結(jié)果為:
bash: qwe: qwe doesnot exit
變量的擴(kuò)展
${#var}
字符串的長度
例如:
a='aaa'
echo ${#a}
結(jié)果為:
3
${var#Pattern}, ${var##Pattern}
刪除從$var前端開始的最短或最長匹配$Pattern的字符串。
例如:
a='abcd1234abcd1234abcd1234'
echo ${a#*abcd}
echo ${a##*abcd}
輸出為:
1234abcd1234abcd1234
1234
${var%Pattern}, ${var%%Pattern}
刪除從$var后端開始的最短或最長匹配$Pattern的字符串。
例如:
a='abcd1234abcd1234abcd1234'
echo output:${a%abcd*}
echo output:${a%%abcd*}
輸出為:
output:abcd1234abcd1234
output:
${var:pos}
變量var被展開成從位移pos個(gè)字符往后的值
例如:
a='abcd'
echo ${a:2}
輸出為:
cd
${var:pos:len}
從變量var中展開成從位移pos的字符往后最長為len的字符串。與上一個(gè)命令用法相仿。
${var/Patten/Replacement}
在變量var第一個(gè)匹配Pattern的字符串用Replacement代替
${var//Patten/Replacement}
所有在變量var中被Pattern匹配到的都由Replacement代替。
例如:
a='abcd1234abcd1234abcd'
echo ${a/abcd/1234}
echo ${a//abcd/1234}
輸出為:
12341234abcd1234abcd
12341234123412341234
${var/#Pattern/Replacement}
如果變量var的前綴匹配模式Pattern,則用Replacement代替匹配模式的字符串.
${var/%Pattern/Replacement}
如果變量var的后綴匹配模式Pattern,則用Replacement代替匹配模式的字符串.
例如:
a='abcd1234abcd1234abcd'
echo ${a/#ab/1234}
echo ${a/%cd/1234}
echo ${a/#bc/1234}
echo ${a/%bc/1234}
輸出為:
1234cd1234abcd1234abcd
abcd1234abcd1234ab1234
abcd1234abcd1234abcd
abcd1234abcd1234abcd
${!varprefix*}, ${!varprefix@}
匹配所有前面聲明過的變量,并且變量名以varprefix開頭.
例如:
abc1=1
abc2=a
abc3=
echo ${!abc*}
echo ${!abc@}
輸出為:
abc1 abc2 abc3
abc1 abc2 abc3