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 會(huì)列出所有在此腳本前面已定義的函數(shù)出來。而declare -f function_name則只會(huì)列出指定的函數(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ù)會(huì)顯示所有的變量的值辛辨。傳參數(shù)只會(huì)顯示對(duì)應(yīng)的變量的值捕捂。
常用變量使用方法
${parameter}
運(yùn)行如下腳本:
#!/bin/bash
para='a'
echo ${para}
運(yùn)行結(jié)果為:
a
其中para是腳本的變量。也可以簡寫為$para
的形式斗搞,但是在某種情況下可能會(huì)引起歧義指攒。
在一個(gè)雙引號(hào)(" ")里的變量引用不會(huì)禁止變量替換。所以雙引號(hào)被稱為部分引用僻焚,有時(shí)也稱為"弱引用"允悦。而在一個(gè)單引號(hào)里(' ')的變量替換是被禁止的,變量名只被解釋為普通的字面意思虑啤。所以單引號(hào)被稱為"全局引用"隙弛,有時(shí)也被稱為強(qiáng)引用。
未初始化的變量又一個(gè)空的值(null)但是在算術(shù)運(yùn)算中會(huì)按照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