shell-数组
[root@localhost ~]# echo $(seq 1 10) #取出1至10内的整数。 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# c=$(echo 5.12*2+0.876 |bc) #bc命令计算浮点数。 [root@localhost ~]# echo $c 11.116
浮点数计算
[root@localhost ~]# a=1.23 [root@localhost ~]# b=3.13 [root@localhost ~]# c=$(echo $a+$b |bc) [root@localhost ~]# echo $c 4.36
[root@localhost ~]# cat for-seq.sh #!/bin/bash for i in $(seq 1 10) do echo $i done [root@localhost ~]# bash for-seq.sh 1 2 3 4 5 6 7 8 9 10
数组
[root@localhost ~]# declare -a abc 定义一个数组 [root@localhost ~]# abc[0]=1 [root@localhost ~]# abc[1]=2 [root@localhost ~]# echo ${abc[*]} 1 2
[root@localhost ~]# unset abc[1] [root@localhost ~]# unset abc[0] [root@localhost ~]# abc=(1 2 3 4 5 6) #这里必须是小括号,各值之间用空格分隔。 [root@localhost ~]# echo ${abc[*]} 1 2 3 4 5 6
[root@localhost ~]# echo ${abc[@]}
1 2 3 4 5 6
[root@localhost ~]# a="0 9 8 7" [root@localhost ~]# echo ${a[*]} 0 9 8 7
[root@localhost ~]# abc=($a) [root@localhost ~]# echo ${abc[@]} 0 9 8 7
[root@localhost ~]# echo ${abc[0]} 0 [root@localhost ~]# echo ${abc[1]} 9 [root@localhost ~]# echo ${abc[2]} 8 [root@localhost ~]# echo ${abc[3]} 7 [root@localhost ~]# echo ${abc[4]} [root@localhost ~]#
我们某些命令的结果所得到的变量,某些命令执行后所得到的变量,比如awk从一个命令的结果里截取指定列是有很多数字的,把所有的数值截取出来会赋予一个变量,这个变量里的所有值当做一个整体给了这个变量。
这个时候调用这个变量会调用出一个整体来的,这些值不好去处。我可以把这个变量放到小括号里。然后把这个小括号里的所有的值赋予数组变量。
[root@localhost ~]# a=$(ps aux |awk 'NR>1 {print $3}') [root@localhost ~]# 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
[root@localhost ~]# abc=($a) [root@localhost ~]# 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
[root@localhost ~]# 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占用率累加。
[root@localhost ~]# 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
[root@localhost ~]# 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
数组元素修改。 [root@localhost ~]# abc=(1 2 3 4 5) [root@localhost ~]# abc[3]=10 [root@localhost ~]# echo ${abc[*]} 1 2 3 10 5 [root@localhost ~]# bcd=(${abc[*]} 9) #其实就是变量叠加 [root@localhost ~]# echo ${bcd[*]} 1 2 3 10 5 9
数组切片。 [root@localhost ~]# abc=(1 2 3 4 5 6 7 8 9 10) [root@localhost ~]# echo ${abc[*]} 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# echo ${abc[*]:1} #从下标为1的位置开始取值。第一个冒号后面那个数字表示从哪个下标值开始取值。 2 3 4 5 6 7 8 9 10 [root@localhost ~]# echo ${abc[*]::3} #从下标为0的位置开始连续取3个值。 1 2 3 [root@localhost ~]# echo ${abc[*]:0:3} 1 2 3 [root@localhost ~]# echo ${abc[*]:2:3} #从下标为2的位置开始连续取3个值。 3 4 5 [root@localhost ~]# echo ${abc[*]:(-2):3} #不够3个数值了,只能取出两个数值。 9 10 [root@localhost shell]# abc=(1 2 3 4 5) [root@localhost shell]# def=(${abc[*]:(-2):2}) [root@localhost shell]# echo ${def[*]} 4 5
元素切片 [root@localhost shell]# name=(liujunjun lishi zhangsan) [root@localhost shell]# echo ${name[0]} liujunjun [root@localhost shell]# echo ${name[0]:1} #从第一个元素下标值为1的位置开始到最后。 iujunjun [root@localhost shell]# echo ${name[0]::3} 从第一个元素下标值为1的位置开始取3个字符。 liu [root@localhost shell]# echo ${name[0]:2:3} uju [root@localhost shell]# echo ${name[0]:(-2):2} un
数组元素替换。 [root@localhost shell]# num=(one two three four five) #只替换每一个元素的第一个e为E [root@localhost shell]# echo ${num[@]/e/E} onE two thrEe four fivE [root@localhost shell]# echo ${num[@]//e/E} #全部替换 onE two thrEE four fivE [root@localhost shell]# echo ${num[@]/e/} #删除 on two thre four fiv [root@localhost shell]# echo ${num[@]//e/} on two thr four fiv [root@localhost shell]# echo ${num[0]/#o/O} #把第0个下标值的第一个小写o,替换成大写O One [root@localhost shell]# echo ${num[0]/%e/U} #把第0个下标值的最后一个小e,替换成大字U。 onU
[root@localhost ~]# 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 [root@localhost ~]# bash sz3.sh 2018 04 28 12 15 30
利用数组求最大值。
[root@localhost ~]# 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." ~ [root@localhost ~]# bash sz4.sh 数组中最大的值是100.
字符串反转输出
[root@localhost ~]# a=$(seq 1 9) [root@localhost ~]# echo $a 1 2 3 4 5 6 7 8 9 [root@localhost ~]# echo $a|rev 9 8 7 6 5 4 3 2 1
[root@localhost ~]# 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 [root@localhost ~]# 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