shell中數組的使用


1 數組的定義

1.1 普通數組

  1. 常規定義
num=(1 2 3)
num[3]=4;num[4]=5

或者

str1=('a' 'b' 'c')/str1=(a b c)
str2[0]=a
str2[1]='b'
str2[5]=d
str2[3]=c

備注:在使用形如str[0]=1定義數組是,數組的下標值可以不是連續的正整數,元素的順序按照下標的升序排列,數組的長度由實際包含的元素個數決定,不受下標值的影響。echo ${str2[0]};echo ${str2[5]的值為a decho ${str[2]}的值為空。
2. 特殊定義
1. 在for循環中,也可以直接聲明並使用數組
for num in 1 2 3 4 5 do echo "num is: ${num}" done
2. 使用自定義的分隔符分割
str="a,b,c" OLD_IFS="$IFS" IFS="," arr=($str) IFS="$OLD_IFS"`
此時arr數組的值為a b c
或者是:str="m,n";IFS=",";arr=($str),也能按照","對字符串進行分割。與上一條的區別是,上一條更改了IFS的默認值,之后又改了回去,但是第3條沒有改回去。IFS的默認值為空格、teb或換行。詳細的分析見:參考文章

1.2 關聯數組

bash從4.0版本支持關聯數組的使用,使用方式類似高級語言的Map數組。

  1. 聲明關聯數組
    declare -A user
  2. 定義數組
user[name]='jack'
user[age]=18

或者user=([name]='jack' [age]=18)
此時echo ${user[name]};echo ${user[age]}的結果是jack 18
3. 備注
1. 如果不聲明數組為關聯數組,user["name]="jack;user["sex"]="M",結果數組的長度為1,user["name"]的值會被user["sex"]的值覆蓋。echo $user["name"];echo $user["sex"]的值為M M.
2. 數字下標也支持字符型的。num["1"]="111"num[1]="111"是等效的,並且字符型數字做下標不會有上一條的現象,num["1"]=1;num["2"]=2;num["3"]=3,數組num的長度為3。



2. 數組的遍歷

2.1 for循環

  1. 高級語言的形式
for((i=0;i<${#num[@]};i++))
do
 echo "num is: ${num[i]}"
done
  1. foreach形式
for nu in ${num[*]}
do
 echo "num is: $nu"
done

其中,${num[*]${num[@]效果相同

2.2 while

i=0
while [ $i -lt ${#num[@]} ]
do
 echo "num is: ${num[$i]}"
 echo "i is: $i"
 i=`expr $i + 1`
done 

備注:i的自增還可以使用i=$[$i+1]let "i+=1"i=$(($i+1))。具體的shell運算規則請參考xxx.

2.3 until

i=0
until [ $i -ge ${#num[*]} ]
do
 echo "num is: ${num[$i]}"
 i=`expr $i + 1`
done

2.4 對關聯數組的遍歷

  1. for循環遍歷
for u in ${!user[@]}
do
 echo "user's ${u} is : ${user[$u]}
done

結果是:

user's name is : jack
user's age is : 18

備注:#{!user[@]}獲取的是關聯數組的所有下標值組成的數組

3. 數組增加元素

  1. 添加單個元素
    1. 添加元素到數組頭
    num=(3 ${num[@]})
    
    此時num的值為3 1 2 3 4 5
    1. 添加元素到數組尾
    num=(${num[@]} 6)
    
    此時num的值為3 1 2 3 4 5 6
    或者使用下標添加:num[${#num[@]}]=7,此時num的值為3 1 2 3 4 5 6 7
  2. 添加其他數組到數組
    類似於添加單個元素
    1. 添加其他數組到數組頭abc=(11 22 33);num=(${abc[@]} ${num[@]})
    2. 添加其他數組到數組尾num=(${num[@]} ${abc[@]})

4. 數組更新元素值

  1. 使用下標值更新數組
    num[0]=22222或者num[0]=${abc[2]}
  2. 用一個數組更新單個值
    num[1]=${abc[@]}
    此時num中的一個值被abc數組替換,相當於刪除下標為1的值,並從下標1開始添加若干個元素。

5. 數組刪除元素值

unset num[1]或者unset user[name]

6. 刪除數組

unset num


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM