【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 使用循环的方式遍历数组

  1. 直接取值
for i in "${array1[@]}"
do
	echo $i
done
  1. 通过下标取值
for i in ${!array1[@]}
do
	echo ${array1[i]}
done

3 练习题

  1. 随机输出一个用户名
vim randomUsers.sh
#!/bin/bash
users=($(awk -F: '{print $1}' /etc/passwd))
len=${#users[*]}
index=$[RANDOM%len]
echo ${users[index]}

  1. 随机输出单个字母
#!/bin/bash
Char=({a..z} {A..Z})
len=${#Char[*]}
index=$[RANDOM%len]
echo ${Char[index]}
  1. 输出由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
  1. 在/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
  1. 随机创建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
  1. 在/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. 写一个双色球程序,执行后随机生成一注双色球。
    红球: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[*]}
  1. 分类统计不同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
  1. 分类统计网络连接的各种状态的数量(使用数组)
#!/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

  1. 课堂笔记
  2. shell数组详解 by 运维@小兵
    https://blog.csdn.net/anqixiang/article/details/114415491
  3. 51CTO博客作者独弹古调 https://blog.51cto.com/hunkz/1579014
  4. 数组实现统计TCP中每种状态的数量 by 51DevOps-刺天冬
    https://blog.csdn.net/qq_43316814/article/details/105983246
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值