數組
變量:存儲單個元素的內存空間
數組:存儲多個元素的連續的內存空間,相當于多個變量的集合
數組名和索引
索引:編號從0開始,屬于數值索引
注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引,
八十的數組支持稀疏格式(索引不連續
聲明數組:
Declare -a ARRAY_NAME
Declare -A ARRAY_NAME:關聯數組
注意:兩者不可相互轉換
數組元素的賦值
- 一次只賦值一個元素ARRAY_NAME[INDEX]=VALUE weekdays[0]=”sunday weekdays[4]=”thursday”
- 一次賦值全部元素ARRAY_NAME=(“VAL1” “VAL2” “VAL3”..)
- 只賦值特定元素 ARRAY_NAME([0]=“VAL1”[3]=”VAL2..”)
- 交互式數組值對賦值 read -a ARRAYx
Title=({ceo coo cto ufo})
Num=({1..10})
Touch /app/f{1..10}.sh
File=({/app/f*.sh})
只要能生成列表,就可以放進去
交互式
Read -a teachers ???mage ??wang ?zhang
echo ${teachers[@]}
顯示所有數組 :declare -a
引用數組元素
${ARRAY_NAME[INDEX]}
注意:省略[index]表示引用下標為0的元素
引用數組所有元素:
${ARRAY_NAME[*]}
${ARRAY_NAME[@]}
數組的長度(數組中的元素個數)
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
刪除數組中的某個元素:導致稀疏格式
unset ARRAY[index]
刪除整個數組: unset ARRAY
數組數據處理
關聯數組 ??關聯數組意思是下標時自定義的
Declare -A ARRAY_NAME
ARRAY_NAME=([IDX_NAME]=’VAL1’ [IDX_NAME2]=’VAL2’…)
關聯數組必須先聲明再調用
declare -A arr
Arr[a]=1
Arr[b]=2
Arr[c]=3
向數組中追加元素:
num={[1..10]}
unset num [3]
Num[3]=44
#!/bin/bash
declare -A ?disk
df|grep ‘/dev/sd’ > df.log
while read line;do
????????index=`echo $line|cut -d ” ” -f1`
????????echo index=$index
????????per=`echo $line |sed -r ‘s/.* ([0-9]+)%.*/\1/’`
????????echo per=$per
????????disk[“$index”]=$per
????????echo ${disk[*]}
????????echo “========”
done < df.log
echo ${disk[*]}
注意:df linux服務器的文件系統的磁盤空間占用情況
df|grep ‘/dev/sd’ > df.log將grep取出來的數據重定向到df.log中,done < df.log 將文件中的數據送給read,read逐行讀取數據進行處理,每次處理都打印相關的輸出,最后跳出循環,打印數組所有值,
While開啟一個子循環,它的父循環中的數據對子循環無效,因此要重新定義到df.log中,
數組數據處理
引用數組中的元素:
數組切片:${ARRYAY[@]:offset:number}
Offset:要跳出的元素個數
Number:要取出的元素個數
取偏移量之后的所有元素
${ARRAY[@]:offset}
num=({1..10})
{num[@]:3:4} ?跳過3個取4個
向數組中追加元素:ARRAY[${#ARRAY[@]}]=VALUE
題目:生成10個隨機數保存于數組中,并找出其最大值和最小值
#!/bin/bash
declare -a rand
for ((i=0;i<10;i++));do
rand[$i]=$RANDOM
[ “$i”-eq 0 ] && max=${rand[$i]} && min=${rand[$i]} && continue
[ ${rand[$i]} -gt $max ] && ?max=${rand[$i]} && continue
[ ${rand[$i]} -lt $min ] && min=${rand[$i]}
done
echo ${rand[*]}
echo “max:$max ?min:$min”
~
#!/bin/bash
declare -a rand
declare -i max=0
declare -i min=32767 ??#隨機生成的數字,最大值時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”
編寫腳本,定義一個數組,數組中的元素是/var/log目錄下所有已.log結尾的文件;統計出其下方為偶數的文件中的行數之和
#!/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.”
題目,將下圖所示,實現轉置矩陣matrix.sh
#!/bin/bash
declare -A matrix=([00]=1 [01]=2 [02]=3 [10]=4 [11]=5 [12]=6 [20]=7 [21]=8 [22]=9)
size=3
showmatrix(){
for ((i=0;i<size;i++));do
for((j=0;j<size;j++));do
echo -n “${matrix[$i$j]} ??”
done
echo
done
}
echo “Before convert”
showmatrix
for ((i=0;i<size;i++));do
for((j=i;j<size;j++));do
if [ $i -ne $j ];then
temp=${matrix[$i$j]}
matrix[$i$j]=${matrix[$j$i]}
matrix[$j$i]=$temp
fi
done
echo
done
echo “After convert”
showmatrix
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/90783