一:定義
二:數(shù)組的聲明與定義
三:數(shù)組的讀取與賦值
四:特殊使用
五:練習(xí)
一:定義
變量:存儲單個元素的內(nèi)存空間
數(shù)組:存儲多個元素的連續(xù)的內(nèi)存空間,相當(dāng)于多個變量的集合
-
數(shù)組名和索引
- 索引:編號從0 開始献幔,屬于數(shù)值索引
注意:索引可支持使用自定義的格式匾效,而不僅是數(shù)值格式器瘪,即為關(guān)聯(lián)索引跃巡, bash4.0 版本之后開始支持 bash 的數(shù)組支持稀疏格式(索引不連續(xù))
- 索引:編號從0 開始献幔,屬于數(shù)值索引
二:數(shù)組的聲明與定義
declare -a ARRAY_NAME
declare -A ARRAY_NAME: 關(guān)聯(lián)數(shù)組
注意:兩者不可相互轉(zhuǎn)換
[root@centos7 ~]# a=(1 2 3 4 5)
[root@centos7 ~]# echo $a
一對括號表示的是數(shù)組汤善,數(shù)組元素用空格符號分隔開
三:數(shù)組的讀取與賦值
- 得到長度
[root@centos7 ~]# echo ${#a[@]}5
用${#數(shù)組名[ @或* ]}可以得到數(shù)組長度
- 讀取
[root@centos7 ~]# echo ${a[2]}3
[root@centos7 ~]# echo ${a[*]}1 2 3 4 5
用${ 數(shù)組名[ 下標 ] }什猖,下標是從0開始 。下標是:*或者@得到整個數(shù)組內(nèi)容
- 賦值
[root@centos7 ~]# a[1]=100
[root@centos7 ~]# echo ${a[*]}
1 100 3 4 5
[root@centos7 ~]# a[5]=100
[root@centos7 ~]# echo ${a[*]}
1 100 3 4 5 100
直接通過 數(shù)組名[ 下標 ] 就可以對其直接進行引用賦值红淡,如果下標不存在不狮,自動添加一個新的數(shù)組元素
- 刪除
[root@centos7 ~]# a=(1 2 3 4 5)
[root@centos7 ~]# echo ${a[*]}
1 2 3 4 5
[root@centos7 ~]# unset a
[root@centos7 ~]# echo ${a[*]}
[root@centos7 ~]# a=(1 2 3 4 5)
[root@centos7 ~]# unset a[1]
[root@centos7 ~]# echo ${a[*]}
1 3 4 5
[root@centos7 ~]# echo ${#a[*]}4
直接通過:unset 數(shù)組[ 下標 ] 可以清除相應(yīng)的元素,不帶下標在旱,清除整個數(shù)組
四:特殊使用
- 分片
[root@centos7 ~]# a=(1 2 3 4 5)
[root@centos7 ~]# echo ${a[@]:0:3}
1 2 3
[root@centos7 ~]# echo ${a[@]:1:4}
2 3 4 5
[root@centos7 ~]# c=(${a[@]:1:4})
[root@centos7 ~]# echo ${#c[@]}
4
[root@centos7 ~]# echo ${c[*]}
2 3 4 5
直接通過 ${ 數(shù)組名 [ @或*]: 起始位置: 長度 } 切片原先的數(shù)組摇零,返回時字符串,中間用空格分開颈渊,因此如果加上”( )”遂黍,將得到切片數(shù)組。上面的例子中俊嗽,c 就是一個新的數(shù)組
- 替換
[root@centos7 ~]# a=(1 2 3 4 5)
[root@centos7 ~]# echo ${a[@]/3/100}
1 2 100 4 5
[root@centos7 ~]# echo ${a[@]}
1 2 3 4 5
[root@centos7 ~]# a=(${a[@]/3/100})
[root@centos7 ~]# echo ${a[@]}
1 2 100 4 5
調(diào)用方法是:${ a[@或*] /查找字符/替換字符 }雾家,該操作不會改變原來的數(shù)組內(nèi)容,如果需要修改绍豁,可以參考上面的例子芯咧,重新定義數(shù)組
從上面講到的,大家可以發(fā)現(xiàn)Linux shell的數(shù)組已經(jīng)很強大了。下面是一些實棧練習(xí)題
五:練習(xí)
1: 示例:生成10 個隨機數(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"
2:編寫腳本邪铲,定義一個數(shù)組,數(shù)組中的元素是/var/log 目錄下所有以 .log 結(jié)尾的文件无拗;要統(tǒng)計其下標為偶數(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ù)組中,采用冒泡算法進行升序或降序排序
[root@fengl bin]# cat sz.sh
#!/bin/bash
declare -a arr
until echo ${arr[*]} | grep -E "^[[:digit:]‘ ‘]+$" &> /dev/null;
do
read -p "請輸入一組數(shù)字英染,每個數(shù)字以空格隔開:" -a arr
done
up () {
local i=$[`echo ${#arr[*]}`-1]
while [ $i -ge 0 ] ;
do
local n=$[i-1]
while [ $n -ge 0 ] ;
do
if [[ ${arr[$i]} -lt ${arr[$n]} ]] ;then
local x=${arr[$i]}
local y=${arr[$n]}
arr[$i]=$y
arr[$n]=$x
fi
let n--
done
let i--
done
echo ${arr[*]}
}
down () {
local i=$[`echo ${#arr[*]}`-1]
while [ $i -ge 0 ] ;
do
local n=$[i-1]
while [ $n -ge 0 ] ;
do
if [[ ${arr[$i]} -gt ${arr[$n]} ]] ;then
local x=${arr[$i]}
local y=${arr[$n]}
arr[$i]=$y
arr[$n]=$x
fi
let n--
done
let i--
done
echo ${arr[*]}
}
echo "升序排列為:"
up
echo "降序排列為:"
down