shell腳本編程進階:數(shù)組

一、數(shù)組(array)

1.變量:存儲單個元素的內(nèi)存空間;
2.數(shù)組:存儲多個元素的連續(xù)的內(nèi)存空間海渊,相當于多個變量的集合;
3.數(shù)組名和索引(下標)

索引:編號從0開始哲鸳,屬于數(shù)值索引臣疑;
注意:索引可支持使用自定義的格式,而不僅是數(shù)值格式徙菠,即為關(guān)聯(lián)索引讯沈,bash4.0版本之后開始支持;
bash --version  查看bash版本
例如:自定義索引為字母和單詞(first)懒豹;
bash的數(shù)組支持稀疏格式(索引不連續(xù))芙盘;

4.聲明數(shù)組

declare -a ARRAY_NAME(數(shù)組名)
declare -A ARRAY_NAME: 關(guān)聯(lián)數(shù)組(必須先聲明數(shù)組)
注意:兩者不可相互轉(zhuǎn)換
臨時生效(exit)驯用;先聲明,再使用儒老;

二蝴乔、數(shù)組賦值

1.數(shù)組元素的賦值

(1) 一次只賦值一個元素;

ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday"
weekdays[4]="Thursday"
echo ${weekdays[0]}  顯示數(shù)組的某個元素
echo ${weekdays[4]}
unset weekdays[0]  刪除數(shù)組中的某個索引
unset weekdays  刪除數(shù)組中的全部索引
引號作用:"a_b"這個形式必須加引號驮樊;

(2) 一次賦值全部元素:

ARRAY_NAME=("VAL1" "VAL2" "VAL3" ...)
Paste_Image.png
Paste_Image.png

(3) 只賦值特定元素:

ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)
Paste_Image.png

(4) 交互式數(shù)組值對賦值

read -a ARRAY
Paste_Image.png

(5)花樣賦值

alpha=({a..z})
alpha=({1..10..2})
filename=(/app/bin/*.sh)
filename=(f{1..6}.{log,txt})
Paste_Image.png

(6)顯示所有數(shù)組: declare -a

2.引用數(shù)組

(1)引用數(shù)組元素:

${ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下標為0的元素
echo ${ARRAY_NAME}

(2)引用數(shù)組所有元素:

${ARRAY_NAME[*]}
${ARRAY_NAME[@]}
Paste_Image.png

(3)數(shù)組的長度(數(shù)組中元素的個數(shù)):

${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
Paste_Image.png

(4)刪除數(shù)組中的某元素:導致稀疏格式

unset ARRAY[INDEX]

(5)刪除整個數(shù)組:

unset ARRAY
Paste_Image.png
Paste_Image.png

三薇正、數(shù)組數(shù)據(jù)的處理

1.引用數(shù)組中的元素:

數(shù)組切片:${ARRAY[@]:offset:number}
offset: 要跳過的元素個數(shù)
number: 要取出的元素個數(shù)
取偏移量之后的所有元素${ARRAY[@]:offset}
Paste_Image.png

2.向數(shù)組中追加元素:

ARRAY[${#ARRAY[*]}]=value
索引號=數(shù)組元素個數(shù)
Paste_Image.png

3.關(guān)聯(lián)數(shù)組:

declare -A ARRAY_NAME 
ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘...)
注意:關(guān)聯(lián)數(shù)組必須先聲明再調(diào)用

四、字符串

1.字符串切片

${#var}:返回字符串變量var的長度
${var:offset}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始囚衔,到最后的部分挖腰,offset的取值在0 到${#var}-1 之間(bash4.2后,允許為負值)
${var:offset:number}:返回字符串變量var中從第offset個字符后(不包括第offset個字符)的字符開始练湿,長度為number的部分
${var: -length}:取字符串的最右側(cè)幾個字符
注意:冒號后必須有一個空白字符
${var:offset:-length}:從最左側(cè)跳過offset字符猴仑,一直向右取到距離最右側(cè)lengh個字符之前的內(nèi)容
${var: -length:-offset}:先從最右側(cè)向左取到length個字符開始,再向右取到距離最右側(cè)offset個字符之間的內(nèi)容
注意:-length前空格
Paste_Image.png

2.字符串處理

基于模式取子串

(1) ${var#*word}:其中word可以是指定的任意字符
功能:自左而右肥哎,查找var變量所存儲的字符串中辽俗,第一次出現(xiàn)的word, 刪除字符串開頭至第一次出現(xiàn)word字符之間的所有字符
(2) ${var##*word}:同上,貪婪模式篡诽,不同的是崖飘,刪除的是字符串開頭至最后一次由word指定的字符之間的所有內(nèi)容
示例:
file="var/log/messages“
${file#*/}: log/messages
${file##*/}: messages
(3) ${var%word*}:其中word可以是指定的任意字符;
功能:自右而左杈女,查找var變量所存儲的字符串中朱浴,第一次出現(xiàn)的word, 刪除字符串最后一個字符向左至第一次出現(xiàn)word字符之間的所有字符;
file="/var/log/messages"
${file%/*}: /var/log
(4) ${var%%word*}:同上达椰,只不過刪除字符串最右側(cè)的字符向左至最后一次出現(xiàn)word字符之間的所有字符翰蠢;
示例:
url=http://www.magedu.com:80
${url##*:} 80
${url%%:*} http
Paste_Image.png

查找替換

${var/pattern/substr}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串砰碴,以substr替換之
${var//pattern/substr}: 查找var所表示的字符串中躏筏,所有能被pattern所匹配到的字符串,以substr替換之
${var/#pattern/substr}:查找var所表示的字符串中呈枉,行首被pattern所匹配到的字符串趁尼,以substr替換之
${var/%pattern/substr}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串酥泞,以substr替換之
Paste_Image.png

查找并刪除

${var/pattern}:刪除var所表示的字符串中第一次被pattern所匹配到的字符串
${var//pattern}:刪除var所表示的字符串中所有被pattern所匹配到的字符串
${var/#pattern}:刪除var所表示的字符串中所有以pattern為行首所匹配到的字符串
${var/%pattern}:刪除var所表示的字符串中所有以pattern為行尾所匹配到的字符串
Paste_Image.png
字符大小寫轉(zhuǎn)換
${var^^}:把var中的所有小寫字母轉(zhuǎn)換為大寫
${var,,}:把var中的所有大寫字母轉(zhuǎn)換為小寫
Paste_Image.png

五、變量賦值

(1) ${var:-value} 或${var-value}:如果var為空或未設置啃憎,那么返回value芝囤;否則返回var的值
Paste_Image.png
(2) ${var:+value}:如果var非空,則返回value,否則返回空值
Paste_Image.png
(3) ${var:=value}:如果var為空或未設置悯姊,那么返回value羡藐,并將value賦值給var;否則返回var的值
Paste_Image.png
(4) ${var:?error_info}:如果var為空或未設置悯许,那么在當前終端打印error_info仆嗦;否則返回var的值
Paste_Image.png
為腳本程序使用配置文件,實現(xiàn)變量賦值
(1) 定義文本文件,每行定義“name=value”
單獨創(chuàng)建一個文本文件先壕,統(tǒng)一從一個文件中調(diào)用變量瘩扼;
不同業(yè)務,可以定義不同的腳本文件垃僚;
(2) 在腳本中source此文件即可
Paste_Image.png

六集绰、高級變量用法-有類型變量

Shell變量一般是無類型的,但是bash Shell提供了declare和typeset兩個命令用于指定變量的類型谆棺,兩個命令是等價的栽燕;
declare [選項] 變量名
-r 聲明或顯示只讀變量
-i 將變量定義為整型數(shù)
-a 將變量定義為數(shù)組
-A 將變量定義為關(guān)聯(lián)數(shù)組
-f 顯示此腳本前定義過的所有函數(shù)名及其內(nèi)容
-F 僅顯示此腳本前定義過的所有函數(shù)名
-x 聲明或顯示環(huán)境變量和函數(shù)
-l 聲明變量為小寫字母  declare –l var=UPPER
-u 聲明變量為大寫字母  declare –u var=lower

七、eval命令

eval命令將會首先掃描命令行進行所有的置換包券,然后再執(zhí)行該命令纫谅。
該命令適用于那些一次掃描無法實現(xiàn)其功能的變量,該命令對變量進行兩次掃描溅固;
Paste_Image.png
如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值就稱為間接變量引用兰珍;

variable1的值是variable2侍郭,而variable2又是變量名,variable2的值為value掠河,間接變量引用是指通過variable1獲得變量值value的行為亮元;
variable1=variable2
variable2=value

bash Shell  提供了兩種格式實現(xiàn)間接變量引用
eval tempvar=\$$variable1
tempvar=${!variable1}
Paste_Image.png

八、創(chuàng)建臨時文件

mktemp命令:創(chuàng)建并顯示臨時文件唠摹,可避免沖突

mktemp [OPTION]... [TEMPLATE]
TEMPLATE: filename.XXX
X(大寫)至少要出現(xiàn)三個爆捞;

OPTION:
-d: 創(chuàng)建臨時目錄
-p DIR或--tmpdir=DIR:指明臨時文件所存放目錄位置
Paste_Image.png

九、安裝復制文件

install命令:
install [OPTION]... [-T] SOURCE DEST 單文件
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...創(chuàng)建空目錄
選項:
-m MODE勾拉,默認755
-o OWNER
-g GROUP
Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煮甥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子藕赞,更是在濱河造成了極大的恐慌成肘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斧蜕,死亡現(xiàn)場離奇詭異双霍,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門洒闸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來染坯,“玉大人,你說我怎么就攤上這事丘逸【魄耄” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵鸣个,是天一觀的道長羞反。 經(jīng)常有香客問我,道長囤萤,這世上最難降的妖魔是什么昼窗? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮涛舍,結(jié)果婚禮上澄惊,老公的妹妹穿的比我還像新娘。我一直安慰自己富雅,他們只是感情好掸驱,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著没佑,像睡著了一般毕贼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛤奢,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天鬼癣,我揣著相機與錄音,去河邊找鬼啤贩。 笑死待秃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的痹屹。 我是一名探鬼主播章郁,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼志衍!你這毒婦竟也來了暖庄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤足画,失蹤者是張志新(化名)和其女友劉穎雄驹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淹辞,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡医舆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年俘侠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔬将。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡爷速,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霞怀,到底是詐尸還是另有隱情惫东,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布毙石,位于F島的核電站廉沮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏徐矩。R本人自食惡果不足惜滞时,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滤灯。 院中可真熱鬧坪稽,春花似錦、人聲如沸鳞骤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豫尽。三九已至篙梢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拂募,已是汗流浹背庭猩。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留陈症,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓震糖,卻偏偏與公主長得像录肯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吊说,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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