【007】Linux Shell 学习笔记-数组
1 简介
数组是Shell的一种特殊变量,是一组数据的集合,里面的每个数据被称为一个数组元素。
当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制。
2 基本用法
2.1 索引数组(只支持整数下标)
索引数组的定义
- 方法一
# nums=(2 5 8) # 下标从0开始,依次递增
# nums[100]=hello
- 方法二
array=() #定义一个空数组
array1[0]=a
array1[1]=b
array1[2]=c
2.2 数组的调用
${name[index]}
# echo ${nums[1]}
5
# echo ${nums[*]} # 查看数组所有的值. * 整体 @ 个体
2 5 8 hello
2.3 查看数组的下标
# echo ${!nums[*]} # 按顺序列出所有值的下标
0 1 2 100
2.4 数组的长度
数组的长度 # 元素的个数
# echo ${#nums[@]}
4
2.5 取消数组
# unset nums[100] # 取消数组中的一个元素
# echo ${nums[@]}
2 5 8
# unset nums # 取消整个数组
2.6 关联数组(支持字符串下标)
# declare -A tom # 定义一个关联数组
# tom[age]=20
# tom[sex]=male
# tom[addr]="guangzhou"
# echo ${tom[addr]}
guangzhou
2.7 使用循环的方式遍历数组
- 直接取值
for i in "${array1[@]}"
do
echo $i
done
- 通过下标取值
for i in ${!array1[@]}
do
echo ${array1[i]}
done
3 练习题
- 随机输出一个用户名
vim randomUsers.sh
#!/bin/bash
users=($(awk -F: '{print $1}' /etc/passwd))
len=${#users[*]}
index=$[RANDOM%len]
echo ${users[index]}
- 随机输出单个字母
#!/bin/bash
Char=({a..z} {A..Z})
len=${#Char[*]}
index=$[RANDOM%len]
echo ${Char[index]}
- 输出由10个随机字母组成的字符串
#!/bin/bash
length=10
i=1
seq=({a..z})
num_seq=${#seq[@]}
while [ "$i" -le "$length" ]
do
seqrand[$i]=${seq[$((RANDOM%num_seq))]}
let "i=i+1"
done
echo "The random string is:"
for j in ${seqrand[@]}
do
echo -n $j
done
- 在/test目录中创建一个文件,文件名由10个随机小写字母组成。
#!/bin/bash
chars=({a..z} {A..Z})
len=${#chars[@]}
word=
for i in {1..10}; do
index=$[RANDOM%len]
word=$word${chars[index]}
done
[ -d "/test" ] || mkdir /test
touch /test/$word
- 随机创建10个文件,文件名前缀要随机,包含hunk字符串,结尾是1-10,扩展名是.doc
[root@localhost ~]# vim file1.sh
#!/bin/bash
path1=/data/hunk
[ -d ${path1} ] || mkdir -p ${path1}
cd ${path1}
for i in `seq 1 10`
do
RANDOM1=`head -1 /dev/urandom |od -N 2 | head -1|awk '{print $2}'`
string1=`cat /dev/urandom |sed 's/[^a-zA-Z]'//g|strings -n 2 | head -1`
let n=${RANDOM1}%10+1
touch ${string1}_hunk_${n}.doc
done
[root@localhost ~]# bash file1.sh
[root@localhost ~]# ls /data/hunk/
GHC_hunk_7.doc Mq_hunk_6.doc Rfa_hunk_1.doc tM_hunk_4.doc VY_hunk_2.doc
ho_hunk_8.doc PA_hunk_1.doc slZ_hunk_4.doc Tq_hunk_5.doc zDmz_hunk_2.doc
- 在/test目录下创建10个文件,文件名由随机小写字母组成
#!/bin/bash
letter=({a..z})
len=${#letter[*]}
file=
for j in {1..10};do
for i in {1..10};do
word=$[RANDOM%len]
file=$file${letter[word]}
done
[ -d "/test" ] || mkdir /test
touch /test/$file
file=
done
- 写一个双色球程序,执行后随机生成一注双色球。
红球:1-33中的6个,不能重复
蓝球:1-16中的1个
方法一:unset去重(有bug)
#!/bin/bash
r_num=({1..33})
r_len=${#r_num[*]}
b_num=1({1..16})
b_len=${#b_num[*]}
i=1
echo "红色球:"
while [ $i -le 6 ];do
r_index=$[RANDOM%r_len]
echo -n "${r_num[r_index]} " && unset r_num[r_index] && let i++
done
echo
echo "蓝色球"
b_index=$[RANDOM%b_len]
echo ${b_num[b_index]}
方法二 利用参数flag去重
#!/bin/bash
r_num=({1..33})
r_len=${#r_num[*]}
r_balls=()
j=0
while :;do
index=$[RANDOM%r_len]
r_values=${r_num[index]}
flag=0
for i in "{r_balls[@]}";do
[ "$r_values" == "$i" ] && flag=1 && break
done
[ $flag -eq 0 ] && r_balls[$j]=$r_values && let j++
[ $j -eq 6 ] && break
done
echo ${r_balls[*]}
方法三 : 仅限数字的方法
#!/bin/bash
while :;do
red=$[RANDOM%33+1]
reds[$red]=$red
len=${#reds[*]}
[ $len -eq 6 ] && break
done
echo ${reds[*]}
- 分类统计不同shell的数量
#!/bin/bash
declare -A array
for shell in $(awk -F: '(print $7)' /etc/passwd);do
let array[$shell]++
done
for index in ${array[@]};do
echo ${array[$index]} $index
done
- 分类统计网络连接的各种状态的数量(使用数组)
#!/bin/bash
declare -A array_state
Type=$(netstat -tan |sed '1d' |awk '{print $6}'|grep -v Foreign)
#1.对数组进行的索引赋值
for i in $Type
do
let array_state[$i]++
done
#2.遍历数组
for j in ${!array_state[@]}
do
echo -e "状态: $j\t\t次数: ${array_state[$j]}"
done
Reference
- 课堂笔记
- shell数组详解 by 运维@小兵
https://blog.csdn.net/anqixiang/article/details/114415491 - 51CTO博客作者独弹古调 https://blog.51cto.com/hunkz/1579014
- 数组实现统计TCP中每种状态的数量 by 51DevOps-刺天冬
https://blog.csdn.net/qq_43316814/article/details/105983246