shell腳本變量處理和擴(kuò)展

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翩剪,隨后出現(xiàn)的幾起案子乳怎,更是在濱河造成了極大的恐慌,老刑警劉巖前弯,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚪缀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恕出,警方通過查閱死者的電腦和手機(jī)椿胯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剃根,“玉大人哩盲,你說我怎么就攤上這事”纷恚” “怎么了廉油?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苗傅。 經(jīng)常有香客問我抒线,道長,這世上最難降的妖魔是什么渣慕? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任嘶炭,我火速辦了婚禮,結(jié)果婚禮上逊桦,老公的妹妹穿的比我還像新娘眨猎。我一直安慰自己,他們只是感情好强经,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布睡陪。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兰迫。 梳的紋絲不亂的頭發(fā)上信殊,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音汁果,去河邊找鬼涡拘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛据德,可吹牛的內(nèi)容都是我干的鳄乏。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼晋控,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼汞窗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赡译,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤仲吏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蝌焚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裹唆,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年只洒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了许帐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡毕谴,死狀恐怖成畦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涝开,我是刑警寧澤循帐,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站舀武,受9級(jí)特大地震影響拄养,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜银舱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一瘪匿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寻馏,春花似錦棋弥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宪祥。三九已至聂薪,卻和暖如春家乘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藏澳。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國打工仁锯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翔悠。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓业崖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蓄愁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子双炕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,408評(píng)論 0 5
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章撮抓,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,771評(píng)論 2 9
  • 流程控制 if 單條件 雙分支 多分支 case case支持glob風(fēng)格的通配符: *: 任意長度任意字符?: ...
    毛利卷卷發(fā)閱讀 752評(píng)論 0 1
  • html css javascript 前端框架與插件 項(xiàng)目總結(jié)與日常記錄 前端其他 gulp gulp API ...
    jacktown閱讀 187評(píng)論 0 0
  • 1 早晨堅(jiān)持完成早讀英語妇斤,晚上努力完成英語聽寫,努力調(diào)整一天之內(nèi)的時(shí)間管理周期 2 今天的1分鐘分享丹拯,我談了什么是...
    LiHongxi閱讀 119評(píng)論 0 0