shell-数组

SciRui 2020-01-16

[ ~]# echo $(seq 1 10)            #取出1至10内的整数。
1 2 3 4 5 6 7 8 9 10
[ ~]# c=$(echo 5.12*2+0.876 |bc)    #bc命令计算浮点数。
[ ~]# echo $c
11.116

浮点数计算

[ ~]# a=1.23
[ ~]# b=3.13
[ ~]# c=$(echo $a+$b |bc)
[ ~]# echo $c
4.36
[ ~]# cat for-seq.sh 
#!/bin/bash
        for i in $(seq 1 10)
        do
                        echo $i
        done
[ ~]# bash for-seq.sh 
1
2
3
4
5
6
7
8
9
10

数组

[ ~]# declare -a abc     定义一个数组
[ ~]# abc[0]=1
[ ~]# abc[1]=2
[ ~]# echo ${abc[*]}
1 2
[ ~]# unset abc[1]
[ ~]# unset abc[0]
[ ~]# abc=(1 2 3 4 5 6)  #这里必须是小括号,各值之间用空格分隔。
[ ~]# echo ${abc[*]}
1 2 3 4 5 6
[ ~]# echo ${abc[@]}1 2 3 4 5 6



[ ~]# a="0 9 8 7"
[ ~]# echo ${a[*]}
0 9 8 7
[ ~]# abc=($a)
[ ~]# echo ${abc[@]}
0 9 8 7
[ ~]# echo ${abc[0]}
0
[ ~]# echo ${abc[1]}
9
[ ~]# echo ${abc[2]}
8
[ ~]# echo ${abc[3]}
7
[ ~]# echo ${abc[4]}

[ ~]#

我们某些命令的结果所得到的变量,某些命令执行后所得到的变量,比如awk从一个命令的结果里截取指定列是有很多数字的,把所有的数值截取出来会赋予一个变量,这个变量里的所有值当做一个整体给了这个变量。
这个时候调用这个变量会调用出一个整体来的,这些值不好去处。我可以把这个变量放到小括号里。然后把这个小括号里的所有的值赋予数组变量。

[ ~]# a=$(ps aux |awk ‘NR>1 {print $3}‘)
[ ~]# echo $a
0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.2 0.0 0.0 0.0 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.0 0.0 0.0 0.0 0.0
[ ~]# abc=($a)
[ ~]# echo ${abc[*]}
0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.2 0.0 0.0 0.0 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.0 0.0 0.0 0.0 0.0
[ ~]# declare -p abc
declare -a abc=‘([0]="0.1" [1]="0.0" [2]="0.0" [3]="0.0" [4]="0.0" [5]="0.0" [6]="0.0" [7]="0.0" [8]="0.0" [9]="0.0" [10]="0.0" [11]="0.0" [12]="0.0" [13]="0.0" [14]="0.0" [15]="0.0" [16]="0.0" [17]="0.0" [18]="0.0" [19]="0.0" [20]="0.0" [21]="0.0" [22]="0.0" [23]="0.0" [24]="0.1" [25]="0.0" [26]="0.0" [27]="0.0" [28]="0.0" [29]="0.0" [30]="0.0" [31]="0.0" [32]="0.0" [33]="0.0" [34]="0.0" [35]="0.0" [36]="0.0" [37]="0.0" [38]="0.0" [39]="0.0" [40]="0.0" [41]="0.0" [42]="0.0" [43]="0.0" [44]="0.0" [45]="0.0" [46]="0.0" [47]="0.0" [48]="0.0" [49]="0.0" [50]="0.0" [51]="0.0" [52]="0.0" [53]="0.0" [54]="0.0" [55]="0.0" [56]="0.0" [57]="0.0" [58]="0.0" [59]="0.0" [60]="0.0" [61]="0.0" [62]="0.0" [63]="0.0" [64]="0.0" [65]="0.0" [66]="0.0" [67]="0.0" [68]="0.0" [69]="0.0" [70]="0.0" [71]="0.2" [72]="0.0" [73]="0.0" [74]="0.0" [75]="0.1" [76]="0.0" [77]="0.0" [78]="0.0" [79]="0.0" [80]="0.0" [81]="0.0" [82]="0.0" [83]="0.0" [84]="0.0" [85]="0.1" [86]="0.0" [87]="0.0" [88]="0.0" [89]="0.0" [90]="0.0")‘

cpu占用率累加。

[ ~]# cat CPUsum.sh 
#/bin/bash

                a=$(ps aux |awk ‘NR>1 {print $3}‘)   大于第一行,打印第三列。
                abc=($a)                  把变量a的值赋给abc变量。

                y=$(echo ${#abc[*]})          ${#abc[*]}计算出数组的个数。

                sum=0        
                for i in ${abc[@]}            
                do
                                                sum=$(printf %.2f $(echo $sum+$i |bc))

                done
                echo $sum
[ ~]# bash CPUsum.sh 
0.60

数组变量和位置参数变量
$* ${abc[*]} 当${abc[*]}加上双引号时,会将所有值作为一个整体输出,(不加双引号时与@作用一样)
${abc[@]} #这两组是一样的。

调用数组所有值,
        echo ${abc[*]}
        echo ${abc[@]}
    数组长度获取。
        数组长度(元素数=值的个数)
            ${abc[*]}
        元素长度
            echo ${abc[1]} |wc -L
            echo -n ${abc[1]} |wc -L #去掉换行符后再统计。
数组遍历
        abc=(1 2 3 4 5 6)
        a=0
        for i in ${abc[$a]}                #a就是一个下标值。从0开始。
        do
            echo $i
            let a++
        done
数组元素修改。
        [ ~]# abc=(1 2 3 4 5)
        [ ~]# abc[3]=10
        [ ~]# echo ${abc[*]}
        1 2 3 10 5
        [ ~]# bcd=(${abc[*]} 9)            #其实就是变量叠加
        [ ~]# echo ${bcd[*]}
        1 2 3 10 5 9
数组切片。
        [ ~]# abc=(1 2 3 4 5 6 7 8 9 10)
        [ ~]# echo ${abc[*]}
        1 2 3 4 5 6 7 8 9 10
        [ ~]# echo ${abc[*]:1}            #从下标为1的位置开始取值。第一个冒号后面那个数字表示从哪个下标值开始取值。
        2 3 4 5 6 7 8 9 10    
        [ ~]# echo ${abc[*]::3}            #从下标为0的位置开始连续取3个值。
        1 2 3
        [ ~]# echo ${abc[*]:0:3}
        1 2 3
        [ ~]# echo ${abc[*]:2:3}            #从下标为2的位置开始连续取3个值。
        3 4 5
        [ ~]# echo ${abc[*]:(-2):3}        #不够3个数值了,只能取出两个数值。
        9 10

        [ shell]# abc=(1 2 3 4 5)
        [ shell]# def=(${abc[*]:(-2):2})
        [ shell]# echo ${def[*]}
        4 5
元素切片
        [ shell]# name=(liujunjun lishi zhangsan)
        [ shell]# echo ${name[0]}
        liujunjun

        [ shell]# echo ${name[0]:1}       #从第一个元素下标值为1的位置开始到最后。
        iujunjun
        [ shell]# echo ${name[0]::3}        从第一个元素下标值为1的位置开始取3个字符。    
        liu
        [ shell]# echo ${name[0]:2:3}
        uju
        [ shell]# echo ${name[0]:(-2):2}
        un
数组元素替换。
        [ shell]# num=(one two three four five)        #只替换每一个元素的第一个e为E
        [ shell]# echo ${num[@]/e/E}
        onE two thrEe four fivE
        [ shell]# echo ${num[@]//e/E}                    #全部替换
        onE two thrEE four fivE
        
        [ shell]# echo ${num[@]/e/}                    #删除
        on two thre four fiv
        [ shell]# echo ${num[@]//e/}
        on two thr four fiv

        [ shell]# echo ${num[0]/#o/O}                    #把第0个下标值的第一个小写o,替换成大写O
        One
        [ shell]# echo ${num[0]/%e/U}                    #把第0个下标值的最后一个小e,替换成大字U。
        onU
[ ~]# vi sz3.sh
#!/bin/bash
                a=`echo 2018-04-28 12:15:30_ABC.log |awk -F "." ‘{print $1}‘ |sed -r ‘s/[-:_]/ /g‘ |tr -d [a-zA-Z]`
                abc=($a)
                for i in ${abc[*]}
                do
                                echo $i
                done
[ ~]# bash sz3.sh 
2018
04
28
12
15
30

利用数组求最大值。

[ ~]# vi sz4.sh
#!/bin/bash

                a=(34 78 3 95 62 59 100)

                max=${a[0]}
                len=${#a[@]}


                for ((i=1;i<=$len;i++))
                do
                                if [[ "${a[$i]}" -gt "$max" ]]
                                then
                                                max=${a[$i]}
                                fi

                done
                echo "数组中最大的值是$max."
~
[ ~]# bash sz4.sh 
数组中最大的值是100.

字符串反转输出

[ ~]# a=$(seq 1 9)
[ ~]# echo $a
1 2 3 4 5 6 7 8 9
[ ~]# echo $a|rev
9 8 7 6 5 4 3 2 1
[ ~]# vi 99.sh 
#!/bin/bash

        for i in $(seq 9)
        do
                        for j in $(seq 9)
                        do
                                         [ $j -le $i ] && echo -n "$j*$i=$(($i*$j)) "
                        done
                        echo
        done
[ ~]# bash 99.sh 
1*1=1 
1*2=2 2*2=4 
1*3=3 2*3=6 3*3=9 
1*4=4 2*4=8 3*4=12 4*4=16 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

相关推荐