本文也即《Learning the bash Shell》3rd Edition的第六章Command-Line Options and Typed varilables之讀書筆記之三,但我們將不限於此。數組元素可以是string或者數字,同變數一樣。數組的index從0開始計算,最大可以為599147937791。基本上可以認為沒有限制。
定義方式
可以直接進行賦值
name[2]=two
name[0]=zero
name[1]=one
與上面方式一樣,這裡我們沒有按順序進行賦值。name=([2]=alice [0]=hatter [1]=duchess)
。如果我們按順序進行賦值,可以不需要說明index,name=(a b c)
。如果我們其中有一個不依次賦值,可以指明,如name=(a [3]=b c)
,b賦值給index=3的元素,c按順序賦值給下一個,即index=4。
如果我們定義一個空的數組,可以使用declare –a name
來聲明。變數用${array
[i
]}
,如果沒有指明index,則返回第0個元素。
重設和取消
我們使用組合方式定義,即array=(…)的方式時,如果前面已經定義了數組,將重設整個數組。
如果我們要取消某個元素,可以使用unset array
[i]
,如果我們要出現整個數組,可以使用unset array
,或者unset array
[@]
和unset array
[*]
。
@,*和#
和位置參數一樣,也可以使用@和*,使用*的時候,間隔為IFS。在上面的例子中echo ${name[@]}為zero one two。這可以用for的迴圈中:
for entry in "${name[@]}"; do
echo --$entry--
done
如果index不存在,沒有賦值,返回null,在${array[@]}中,不包含這些元素,只有有效值。例如:
table=([1]=one [3]=three)
#${array
[@]}擷取所有元素內容資訊
echo ${table[@]}
#${!array
[@]}擷取所有元素序號資訊
echo ${!table[@]}
for entry in ${table[@]}; do
echo ==$entry==
done
運行結果如下:
one three
1 3
==one==
==three==
如果需要每個元素都顯現,可以使用for((i=0;i<=3;i++))
的方式。
#是長度的操作,${#array
[i
]}
將返回第i元素的字串的長度。而${#array
[@]}
則返回有效元素的格式,例如上面的例子中${#table[@]}為2。
例子一
:利用/etc/passwd,通過使用者ID擷取使用者名稱:
for entry in $(cut -f 1,3 -d: /etc/passwd); do
#${entry#*:}是前面的使用者ID,${entry%:*}是後面的使用者名稱
echo "set array[${entry#*:}]=${entry%:*}"
array[${entry#*:}]=${entry%:*}
done
echo "User ID $1 is ${array[$1]}."
echo "There are currently ${#array[@]} user accounts on the system."
例子二
:冒泡演算法
#設定數組values
values=(39 5 36 12 9 3 2 30 4 18 22 1 28 25)
#擷取values的個數
numvalues=${#values[@]}
#顯示當前數組的值,用於跟蹤
function showvalues
{
for (( k=0; k < numvalues; k++)); do
echo -ne "${values[$k]} "
done
echo
}
#冒泡演算法
:將被排序的記錄數組R[1..n]垂直排列,每個記錄R看作是重量為R.key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
function bubble
{
for (( i=0; i < numvalues; i++));do
ischanged=false
for((j=numvalues-1; j> i; j--));do
# 如果輕的在下交換之,每次i的迴圈,都可以見最輕的放置在最上,並調整其他的位置,使之更為有序
if [ ${values[j]} -lt ${values[j-1]}
];then
temp=${values[j]}
values[j]=${values[j-1]}
values[j-1]=$temp
ischanged=true
fi
done
showvalues
#如果已經不需要調整,即有序,就跳出迴圈。
if [ ischanged = "false" ] ;then
break;
fi
done
}
相關連結: 我的Linux操作相關文章