【shell】 array数组

shell array数组

1.普通数组

数组的定义有2种,一是一次赋一个值,二是一次赋多值,数组也是一种变量,具体赋值为:数组名[下标]=变量值

[klaus@localhost chapt6]$ array[0]=apple
[klaus@localhost chapt6]$ array[1]=banana
[klaus@localhost chapt6]$ echo "${array[1]}"
banana
[klaus@localhost chapt6]$ echo "${array[0]}"
apple

访问数组元素,array[@]表示所有元素,!array[@]表示数组的索引

[klaus@localhost chapt6]$ echo "${array[@]}"
apple banana
[klaus@localhost chapt6]$ echo "${!array[@]}"
0 1

同时数组也支持切片处理

[klaus@localhost chapt6]$ array[2]=pear
# 从数组下标1开始的2个数
[klaus@localhost chapt6]$ echo "${array[@]:1:2}"
banana pear
# 从数组下标0开始的数
[klaus@localhost chapt6]$ echo "${array[@]:0}"  
apple banana pear

同时也可以支持多个赋值

[klaus@localhost chapt6]$ books=(linux shell docker awk openssh)
[klaus@localhost chapt6]$ echo "${books[1]}"
shell
[klaus@localhost chapt6]$ echo "${books[@]}"
linux shell docker awk openssh
[klaus@localhost chapt6]$ echo "${books[@]:2:1}"
docker

2.关联数组

关联数组和python中的dict有点像,使用之前需要declare,数组索引可以自定义

[klaus@localhost chapt6]$ declare -A info
[klaus@localhost chapt6]$ info=([name]=klaus [sex]=male [age]=23 [height]=178)
[klaus@localhost chapt6]$ echo "${info[name]}"
klaus
[klaus@localhost chapt6]$ echo "${info[sex]}"
male
[klaus@localhost chapt6]$ echo "${info[@]}"  
klaus 178 23 male
[klaus@localhost chapt6]$ echo "${!info[@]}"
name height age sex

同时数组也可以跳过索引定义

[klaus@localhost chapt6]$ books=(linux shell docker awk openssh [30]=opencv)
[klaus@localhost chapt6]$ echo "${!books[@]}"
0 1 2 3 4 30
[klaus@localhost chapt6]$ echo "${books[@]}"
linux shell docker awk openssh opencv

3.实例

3.1 统计/etc/passwd每一行最后参数个数

[klaus@localhost chapt6]$ cat host.sh
#!/bin/bash
declare -A user
if [ $# -eq 0 ];then
    echo "usage: `basename $0` file"
fi

if [ ! -f $1 ];then
    echo "You entered is not a file!"
    exit
else
    while read line
    do
        type=`echo $line | awk -F " " '{print $NF}'`
        let user[$type]++
    done<$1

    for i in ${!user[@]}
    do
        echo "$i: ${user[$i]}"
    done
fi
[klaus@localhost chapt6]$ ./host.sh username.txt
male: 4
unknown: 1
female: 1
[klaus@localhost chapt6]$ cat username.txt
haha male
hehe female
heihei male
huhu male
diudiu male
biubiu unknown

3.2 统计tcp监听状态

[klaus@localhost chapt6]$ cat tcp_state.sh
#!/bin/bash

while true
do
    declare -A status
    type=`netstat -a|awk '/^tcp/'|awk '{print $NF}'`
    for line in $type
    do
        let status[$line]++
    done
    
    for j in ${!status[@]}
    do
        echo "$j:${status[$j]}"
    done
    unset status # shell清空数组的特殊形式
    # sleep 1
    # clear
done
[klaus@localhost chapt6]$ ./tcp_state.sh
ESTABLISHED:2
LISTEN:6
ESTABLISHED:2
发布了80 篇原创文章 · 获赞 86 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/klaus_x/article/details/104213914