引言
在Linux平台上工作,我們經常需要使用shell來編寫一些有用、有意義的腳本程序。有時,會經常使用shell數組。那么,shell中的數組是怎么表現的呢,又是怎么定義的呢?接下來逐一的進行講解,shell中的數組。
數組的定義
何為數組?學過計算機編程語言的同學都知道,數組的特性就是一組數據類型相同的集合(不包括有一些編程語言提出來的關聯數組的概念)。那么shell中數組是怎么定義的呢,我們來看兩種數據類型:一是數值類型,二是字符串類型;雖然shell本身是弱類型的,但也可以這么區分。
數值類型的數組:一對括號表示數組,數組中元素之間使用“空格”來隔開。
舉個列子:
arr_number=(1 2 3 4 5);
字符串類型數組:同樣,使用一對括號表示數組,其中數組中的元素使用雙引號或者單引號包含,同樣使用“空格”來隔開。
arr_string=("abc" "edf" "sss"); 或者 arr_string=('abc' 'edf' 'sss');
數組的操作
我們使用數值類型數組arr_number=(1 2 3 4 5)做為源數組進行相關的講解:獲取數組長度,讀取某個下標的值,對某個下標賦值,刪除、分配和替換以及遍歷。提一個知識點,我們在shell里面想獲取某個變量的值,使用$符開頭,如:$a或者${a}即可。
獲取數組長度
arr_length=${#arr_number[*]}或${#arr_number[@]}均可,即形式:${#數組名[@/*]} 可得到數組的長度。
讀取某個下標的值
arr_index2=${arr_number[2]},即形式:${數組名[下標]}
對某個下標賦值
這里需要提出兩個問題:
第一個問題是如果該下標元素已經存在,會怎么樣?
答:會修改該下標的值為新的指定值。
例如:arr_number[2]=100,數組被修改為(1 2 100 4 5)
第二個問題是如果指定的下標已經超過當前數組的大小,如上述的arr_number的大小為5,指定下標為10或者11或者大於5的任意值會如何?
答:新賦的值被追加到數組的尾部。
例如:arr_number[13]=13,數組被修改為(1 2 100 4 5 13)
刪除操作
清除某個元素:unset arr_number[1],這里清除下標為1的數組;
清空整個數組:unset arr_number;
分片訪問
分片訪問形式為:${數組名[@或*]:開始下標:結束下標},注意,不包括結束下標元素的值。
例如:${arr_number[@]:1:4},這里分片訪問開始下標為1到結束下標為4的值結果輸出為新數組,但不包括下標為4的值。
模式替換
形式為:${數組名[@或*]/模式/新值}
例如:${arr_number[@]/2/98}
數組的遍歷
數組遍歷我們使用for語句來演示:
for v in ${arr_number[@]}; do
echo $v;
done
實現數組逆序輸出
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#!/bin/bash
arr=(1 2 3 4 5 6)
let
i=0
let
j=${
#arr[@]}-1
for
(( i=0;i<j;i++,j-- ))
do
tmp=${arr[i]}
arr[i]=${arr[j]}
arr[j]=$tmp
done
echo
${arr[@]}
exit
$?
|
實現冒泡排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/bin/bash
#冒泡排序
arr=(1 0 9 8 6 7)
for
(( i=0;i<${
#arr[@]};i++ ))
do
for
(( j=${
#arr[@]}-1;j>i;j-- ))
do
if
[[ ${arr[j]} -lt ${arr[j-1]} ]];
then
temp=${arr[j]}
arr[j]=${arr[j-1]}
arr[j-1]=${temp}
fi
done
done
echo
${arr[@]}
exit
$?
|
實現選擇排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#!/bin/bash
#選擇排序
arr=(999 0 7 8 7 9 8 9 9 0 9 8 1 2 5 3 2 1 4 5 0 10000 7 65 5)
let
length=${
#arr[@]}
#已排序序列末尾
for
(( i=0;i<length-1;i++ ))
do
min=$i
#未排序序列
for
(( j=i+1;j<length;j++ ))
do
if
[ ${arr[min]} -gt ${arr[j]} ];
then
min=$j
fi
done
if
[ $min -
ne
$i ];
then
tmp=${arr[min]}
arr[min]=${arr[i]}
arr[i]=$tmp
fi
done
echo
${arr[@]}
exit
$?
|
