1. 程式人生 > 其它 >shell序列和陣列的使用方法

shell序列和陣列的使用方法

一、seq方法和通過內部{begin..end}的效能比較

# time echo {1..100}
1 2 3 ...

real  0m0.000s
user  0m0.001s
sys   0m0.000s

# time echo $(seq 100)
1 2 3 ...

real  0m0.003s
user  0m0.002s
sys   0m0.001s

從上面可以看到,{begin..end}速度比seq呼叫快了不少了。 以後呼叫時候可以考慮通過內部操作符完成。

二、陣列概述

1.陣列的概念

是一種容器,可以同時存放多個數據值。

2.陣列的特點

1.陣列是一種引用資料型別。
2.陣列當中的多個數據,型別 必須統一。
3.陣列長度在程式執行期間不可改變。

3.陣列定義方法
方法1
陣列名=(value0 value1 value2 …)

方法2
陣列名=([0]=value [1]=value [2]=value …)

方法3
列表名=“value0 value1 value2 …”
陣列名=($列表名)

方法4
陣列名[0]=“value”
陣列名[1]=“value”
陣列名[2]=“value”

三、

陣列包括的資料型別

1.資料型別

(1)數值型別
(2)字元型別(字串)
使用" " 或 ’ ’ 定義,防止元素當中有空格,元素按空格分割

2.獲取陣列長度
arr_number=(1 2 3 4 5)
echo ${#arr_number[*]} 或 echo ${#arr_number[@]}
3.獲取資料列表
echo ${arr_number[*]}
或
echo ${arr_number[@]}
4.讀取某個下標賦值
arr_index2=${arr_number[2]}
echo $arr_index2

四、使用陣列

1.陣列遍歷

2.陣列切片

# arry=(1 2 3 4 5 6)
# echo ${arry[*]}    #輸出整個陣列,此處*與@相同       
# 1 2 3 4 5 6     

# echo ${arry[@]:0:2}   #獲取 ${陣列名[@或*]:起始位置:長度} 的值
# 1 2
echo ${arry[@]:2:2}
# 3 4
3.陣列替換

方法一:替換所有符合條件的

格式:${陣列名[*或@]/源引數值/將要替換的引數值}
# arr2=(1 2 3 4 5)
#臨時替換:將陣列arr1中的引數值3替換為66,但原來的陣列中的引數值並不會改變
# echo ${arr2[*]/3/66}     
# echo ${arr2[*]}
# 1 2 3 4 5

#永久替換:可通過重新賦值實現
# arr2=(${arr2[*]/3/66})   
# echo ${arr2[*]}
# 1 2 66 4 5

方法二:替換單個,指定下標替換。

# arry=(1 2 3 4 5 6)
# arry[0]=7
# echo ${arry[*]}
# 7 2 3 4 5 6
4.陣列刪除
格式:unset 陣列名[索引]     #刪除單個
      unset 陣列名          #刪除整個陣列
5.陣列追加元素

方法一:單個新增

# arr=(1 2 3 4 5 6 7)
# echo ${arr[6]}   #7
# arr[7]=8
# echo ${arr[*]} # 1 2 3 4 5 6 7 8

方法二:增加陣列長度填加

# arr4=(1 2 3 4 5 6 7)
# arr4[${#arr4[*]}]=8  #根據長度新增引數
# echo ${arr4[*]}  #1 2 3 4 5 6 7 8

方法三:重新定義陣列

# arr4=(1 2 3 4 5 6 7)
# arr4=("${arr4[@]}" 8 9 10)  #加上新引數重新定義陣列
# echo ${arr4[*]} #1 2 3 4 5 6 7 8 9 10

雙引號不能省略,否則陣列中存在包含空格的元素時會按空格將元素拆分成多個
不能將“@”替換為“*”,如果替換為“* ”,不加雙引號時與“@”的表現一致,加雙引號時,會將陣列array_name中的所有元素作為一個元素新增到陣列中

6.函式返回陣列
檢視程式碼

#!/bin/bash

#用於求陣列中所有元素的累加和
test2 () {
   newarr1=($@)
   arrlist=${newarr1[*]}
   sum=0

   for i in $arrlist
   do
     sum=$[$sum+$i]
   done
   echo $sum

}

#用於把原陣列中所有元素值乘以2後生成一個新的陣列並輸出
test3 () {
    newarr2=($@)
    length=${#newarr2[@]}
    for ((j=0;j<$length;j++))
    do
	echo $j
      newarr2[$j]=$[${newarr2[$j]} * 2]
    done
    echo ${newarr2[*]}

}
######main######

arry=(10 20 30 40 50)
echo "原陣列的列表為:${arry[@]}"
res1=`test2 ${arry[@]}`
res2=`test3 ${arry[@]}`
echo "test2中的新陣列的累加和為:$res1"
echo "test3中的新陣列的累加和為:$res2"