Linux Bash Shell學習(十六):數組

來源:互聯網
上載者:User

  本文也即《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操作相關文章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.