(4)shell腳本編程進(jìn)階之?dāng)?shù)組、字符串切片

(一)數(shù)組定義

  • 數(shù)組:存儲(chǔ)多個(gè)元素的連續(xù)的內(nèi)存空間洽糟,相當(dāng)于多個(gè)變量的集合
  • 數(shù)組名和索引
  • 索引:編號(hào)從0 開始扁瓢,屬于數(shù)值索引
  • 注意:索引可支持使用自定義的格式详恼,而不僅是數(shù)值格式,即為關(guān)聯(lián)索引引几, 昧互,bash4.0版本之后開始支持
  • bash 的數(shù)組支持稀疏格式(索引不連續(xù))
  • 聲明數(shù)組:
    declare -a ARRAY_NAME
    declare -A ARRAY_NAME: 關(guān)聯(lián)數(shù)組
    注意:兩者不可相互轉(zhuǎn)換
  • (1)數(shù)組賦值
    • 一次只賦值一個(gè)元素;
      ARRAY_NAME[INDEX]=VALUE
      weekdays[0]="Sunday"
      weekdays[4]="Thursday"
    • (一次賦值全部元素:
      ARRAY_NAME=("VAL1" "VAL2" "VAL3" ...)
    • 只賦值特定元素:
      ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)
    • 交互式數(shù)組值對(duì)賦值
      read -a ARRAY

(二)引用數(shù)組

  • 引用數(shù)組元素:${ARRAY_NAME[INDEX]}注意:省略[INDEX] 表示引用下標(biāo)為0 的元素
  • 數(shù)組的長度( 數(shù)組中元素的個(gè)數(shù)):
    ${#ARRAY_NAME[*]}
    ${#ARRAY_NAME[@]}

示例:生成10 個(gè)隨機(jī)數(shù)保存于數(shù)組中伟桅,并找出其最大值和最小值
#!/bin/bash
declare -a rand
declare -i max=0
declare –i min=32767
for i in {0..9}; do
rand[$i]=$RANDOM
echo ${rand[$i]}
[ ${rand[$i]} -gt $max ]&& max=${rand[$i]}
[ ${rand[$i]} -lt $min ]&& min=${rand[$i]}
done
echo "Max: $max Min:$min"

編寫腳本敞掘,定義一個(gè)數(shù)組,數(shù)組中的元素是/var/log 目錄下所有以
.log 結(jié)尾的文件楣铁;要統(tǒng)計(jì)其下標(biāo)為偶數(shù)的文件中的行數(shù)之和
#!/bin/bash
declare -a files
files=(/var/log/.log)
declare -i lines=0
for i in $(seq 0 $[${#files[
]}-1]); do
if [ $[$i%2] -eq 0 ];then
let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1)
fi
done
echo "Lines: $lines."

  • (3)數(shù)組數(shù)據(jù)處理
    • 引用數(shù)組中的元素:
      所有元素:${ARRAY[@]}, ${ARRAY[*]}
    • 數(shù)組切片:${ARRAY[@]:offset:number}
      • offset: 要跳過的元素個(gè)數(shù)
      • number: 要取出的元素個(gè)數(shù)
      • 取偏移量之后的所有元素
        ${ARRAY[@]:offset}
    • 向數(shù)組中追加元素:
      ARRAY[${#ARRAY[*]}]
    • 刪除數(shù)組中的某元素:導(dǎo)致稀疏格式
      unset ARRAY[INDEX]
    • 刪除整個(gè)數(shù)組:unset ARRAY
    • 關(guān)聯(lián)數(shù)組:
      declare -A ARRAY_NAME 注意:必須先聲明玖雁,再調(diào)用
      ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘...)

(三)字符串切片

(1)字符串處理切片
  • ${#var}: 返回字符串變量var 的長度
  • ${var:offset}: 返回 字符串變量var 中從第offset個(gè)字符后(不包括第offset個(gè)字符)的字符開始,到最后的部分盖腕,offset的取值在0 到${#var}-1之間(bash4.2 后赫冬,允許為負(fù)值)
  • ${var:offset:number} :返回 字符串變量var 中從第offset個(gè)字符后(不包括第offset個(gè)字符)的字符開始 ,長度為number 的部分
  • ${var: -length}:取字符串的最右側(cè)幾個(gè)字符注意:冒號(hào)后必須有一空白字符
  • ${var:offset:-length}:從最左側(cè)跳過offset 字符赊堪,一直向右取到距離最右側(cè)lengh 個(gè)字符之前的內(nèi)容
  • ${var: -length:-offset}:先從最右側(cè)向左取到length個(gè)字符開始面殖,再向右取到距離最右側(cè)offset個(gè)字符之間的內(nèi)容
(2)字符串處理
  • (1)基于模式取子串

  • ${var#*word}:其中word 可以是指定的任意字符

  • 功能:自左而右,查找var 變量所存儲(chǔ)的字符串中哭廉,第一次出現(xiàn)的word, 刪除字符串開頭至第一次出現(xiàn)word 字符之間的所有字符

  • ${var##*word}:同上脊僚,貪婪模式,不同的是遵绰,刪除的是字符串開頭至最后一次由word 指定的字符之間的所有內(nèi)容

     示例:
     file="var/log/messages“
     ${file#*/}: log/messages
     ${file##*/}: messages
    
  • ${var%word*}:其中word 可以是指定的任意字符辽幌;

  • 功能:自右而左,查找var 變量所存儲(chǔ)的字符串中椿访,第一次出現(xiàn)的word, 刪除字符串最后一個(gè)字符向左至第一次出現(xiàn)word 字符之間的所有字符乌企;
    file="/var/log/messages"
    ${file%/*}: /var/log

  • ${var%%word*}:同上,只不過刪除字符串最右側(cè)的字符向左至最后一次出現(xiàn)word 字符之間的所有字符成玫;
    示例:
    url=http://www.magedu.com:80
    ${url##:} 80
    ${url%%:
    } http

(2)字符串查找替換
  • ${var/pattern/substr}:查找var 所表示的字符串中加酵,第一次被pattern 所匹配到的字符串,以substr替換之

  • ${var//pattern/substr}: 查找var所表示的字符串中哭当,所有能被pattern所匹配到的字符串猪腕,以substr替換之

  • ${var/#pattern/substr}:查找var 所表示的字符串中,行首被pattern 所匹配到的字符串钦勘,以substr替換之

  • ${var/%pattern/substr}:查找var 所表示的字符串中陋葡,行尾被pattern所匹配到的字符串,以substr 替換之

  • ${var/pattern}:查找var所表示的字符串中彻采,刪除第一次被pattern所匹配到的字符串

    ${var//pattern} :所有
    ${var/#pattern} :行首
    ${var/%pattern} :行尾
    
  • 字符大小寫轉(zhuǎn)換

  • ${var^^}:把var 中的所有小寫字母轉(zhuǎn)換為大寫

  • ${var,,}:把var中的所有大寫字母轉(zhuǎn)換為小寫

  • 變量賦值

  • ${var:-value}:如果var 為空或未設(shè)置腐缤,那么返回value捌归;否則返回var 的值,可省略:

  • ${var:+value}:如果var不空岭粤,則返回value 惜索,否則返回空值

  • ${var:=value} :如果var 為空或未設(shè)置,那么返回value绍在,并將value 賦值給var门扇;否則返回var的值

  • ${var:?error_info}:如果var為空或未設(shè)置,那么在當(dāng)前終端打error_info 偿渡;否則返回var 的值

  • 為腳本程序使用配置文件, 實(shí)現(xiàn)變量賦值

  • (1) 定義文本文件臼寄,每行定義“name=value”

  • (2) 在腳本中source此文件即可

(三)高級(jí)變量用法-有類型變量

(1)declare命令

Shell 變量一般是無類型的,但是bash Shell 提供了declaretypeset
declare [ 選項(xiàng)] 變量名
-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

(2)eval 命令
  • 定義:eval 命令將會(huì)首先掃描命令行進(jìn)行所有的置換溜宽,然后再執(zhí)行該命令吉拳。該命令適用于那些一次掃描無法實(shí)現(xiàn)其功能的變量.該命令對(duì)變量進(jìn)行兩次掃描
    [root@server ~]# CMD=whoami
    [root@server ~]# echo $CMD
    whoami
    [root@server ~]# eval $CMD
    root
    [root@server ~]# n=10
    [root@server ~]# echo {0..$n}
    {0..10}
    [root@server ~]# eval echo {0..$n}
    0 1 2 3 4 5 6 7 8 9 10
(3)間接變量引用
  • 如果第一個(gè)變量的值是第二個(gè)變量的名字,從第一個(gè)變量引用第二個(gè)變量的值就稱為間接變量引用
  • variable1 的值是variable2适揉,而variable2 又是變量名留攒,variable2 的值為value ,間接變量引用是指通過variable1獲得變量值value 的行為
    variable1=variable2
    variable2=value
  • bash Shell 提供了兩種格式實(shí)現(xiàn)間接變量引用
    eval tempvar=$$variable1
    tempvar=${!variable1}
    示例:
    [root@server ~]# N=NAME
    [root@server ~]# NAME=wangnan
    [root@server ~]# N1=${!N}
    [root@server ~]# echo $N1
    wangnan
    [root@server ~]# eval N2=$$N
    [root@server ~]# echo $N2
    wangxnan
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫉嘀,一起剝皮案震驚了整個(gè)濱河市炼邀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剪侮,老刑警劉巖拭宁,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瓣俯,居然都是意外死亡杰标,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門彩匕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腔剂,“玉大人,你說我怎么就攤上這事驼仪〉” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵绪爸,是天一觀的道長登渣。 經(jīng)常有香客問我,道長毡泻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任粘优,我火速辦了婚禮仇味,結(jié)果婚禮上呻顽,老公的妹妹穿的比我還像新娘。我一直安慰自己丹墨,他們只是感情好廊遍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贩挣,像睡著了一般喉前。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上王财,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天卵迂,我揣著相機(jī)與錄音,去河邊找鬼绒净。 笑死见咒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挂疆。 我是一名探鬼主播改览,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缤言!你這毒婦竟也來了宝当?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤胆萧,失蹤者是張志新(化名)和其女友劉穎庆揩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸳碧,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盾鳞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞻离。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腾仅。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖套利,靈堂內(nèi)的尸體忽然破棺而出推励,到底是詐尸還是另有隱情,我是刑警寧澤肉迫,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布验辞,位于F島的核電站,受9級(jí)特大地震影響喊衫,放射性物質(zhì)發(fā)生泄漏跌造。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壳贪。 院中可真熱鬧陵珍,春花似錦、人聲如沸违施。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磕蒲。三九已至留潦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辣往,已是汗流浹背兔院。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留排吴,地道東北人秆乳。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像钻哩,于是被迫代替她去往敵國和親屹堰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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