(一)數(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
- 一次只賦值一個(gè)元素;
(二)引用數(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‘...)
- 引用數(shù)組中的元素:
(三)字符串切片
(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 提供了declare
和typeset
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