您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
马哥linux运维学习笔记-bash编程系列之数组
发布时间:2019-03-11 17:16:31编辑:雪饮阅读()
数组的声明与指定数组索引值的获取
[root@mail ~]# cat test.sh
#!/bin/bash
AA=([0]=jerry [1]=tom [6]=nikita)
echo $AA[0]
执行结果
[root@mail ~]# sh test.sh
jerry[0]
上面定义了一个数组,数组中指定了0、1、6三个下标的元素值,那么该数组的长度就是7,其它下标没有定义的元素值为空,但仍旧会被计算到数组长度中。
巧用取余法实现调用数组索引范围内随机索引值
[root@mail ~]# cat test.sh
#!/bin/bash
AA=([0]=jerry [1]=tom [6]=nikita)
INDEX=$[$RANDOM%7]
echo $AA[$INDEX]
[root@mail ~]# sh test.sh
jerry[2]
结合for循环进行随机调用数组内元素
[root@mail ~]# cat test.sh
#!/bin/bash
AA=([0]=jerry [1]=tom [6]=nikita)
for I in {1..20};do
INDEX=$[$RANDOM%7]
echo ${AA[$INDEX]}
done
执行结果:
[root@mail ~]# sh test.sh
nikita
jerry
nikita
tom
tom
nikita
tom
jerry
nikita
数组元素长度与数组总长度的获取
[root@mail ~]# cat test.sh
#!/bin/bash
AA=([0]=jerry [1]=tom [6]=nikita)
##获取数组第一个元素的长度
echo ${#AA}
##获取数组指定索引对应元素的长度
echo ${#AA[0]}
##获取数组总长度
echo ${#AA[*]}
##获取数组总长度
echo ${#AA[@]}
[root@mail ~]# sh test.sh
5
5
3
3
这里数组总长度是将元素值为空的元素排除之后的总长度
数组的第二种声明方式及获取数组的最大值
[root@mail ~]# cat max.sh
#!/bin/bash
ARRAY=(34 73 25 91 49 25 75 133 92 951)
declare -i MAX=${ARRAY[0]}
INDEX=$[${#ARRAY[*]}-1]
for I in `seq 0 $INDEX`;do
if [ $MAX -lt ${ARRAY[$I]} ] ;then
MAX=${ARRAY[$I]}
fi
done
echo $MAX
[root@mail ~]# sh max.sh
951
注意:这里for循环和编程中常用的不一样,这里从0到$INDEX是包含$INDEX的,相当于编程中的$I=0,$I<=$INDEX,$I++
生成随机数组并取该数组的最大值
[root@mail ~]# cat max.sh
#!/bin/bash
for I in {0..9};do
ARRAY[$I]=$RANDOM
echo -n "${ARRAY[$I]} "
done
echo
declare -i MAX=${ARRAY[0]}
INDEX=$[${#ARRAY[*]}-1]
for I in `seq 0 $INDEX`;do
if [ $MAX -lt ${ARRAY[$I]} ] ;then
MAX=${ARRAY[$I]}
fi
done
echo $MAX
[root@mail ~]# sh max.sh
5022 9070 20315 20929 14798 308 29254 14049 7050 11240
29254
生成随机数组并取该数组的最大值(每生成一个元素就休眠1秒)
[root@mail ~]# cat max.sh
#!/bin/bash
for I in {0..9};do
ARRAY[$I]=$RANDOM
echo -n "${ARRAY[$I]} "
sleep 1
done
echo
declare -i MAX=${ARRAY[0]}
INDEX=$[${#ARRAY[*]}-1]
for I in `seq 0 $INDEX`;do
if [ $MAX -lt ${ARRAY[$I]} ] ;then
MAX=${ARRAY[$I]}
fi
done
echo $MAX
[root@mail ~]# sh max.sh
19015 15789 25401 9434 13701 7772 26590 6380 17791 17887
26590
通过用户输入数组长度创建一个和该长度相等的随机数组且数组内元素值不允许重复
该示例包含了函数的声明与调用、以及数组的第三种声明方式和响应用户输入
[root@mail ~]# cat input.sh
#!/bin/bash
read -p "the element numbers[1-39]:" ELENUM
declare -a ARRAY
function COMELE {
for J in `seq 0 $[${#ARRAY[@]}-1]`;do
if [ $1 -eq ${ARRAY[$J]} ]; then
return 1
fi
done
return 0
}
for I in `seq 0 $[$ELENUM-1]`;do
while true;do
ELEMENT=$[$RANDOM%40]
COMELE $ELEMENT
if [ $? -eq 0 ]; then
break
fi
done
ARRAY[$I]=$ELEMENT
echo ${ARRAY[$I]}
done
[root@mail ~]# sh input.sh
the element numbers[1-39]:39
18
30
4
31
11
33
35
8
12
26
9
22
25
29
15
23
6
37
1
13
10
39
17
21
7
16
34
24
27
0
19
38
3
32
36
28
20
5
2
利用信号捕捉实现对ctrl+c的响应
[root@mail ~]# cat max.sh
#!/bin/bash
trap 'echo "No quit..."' INT
for I in {0..9};do
ARRAY[$I]=$RANDOM
echo -n "${ARRAY[$I]} "
sleep 1
done
echo
declare -i MAX=${ARRAY[0]}
INDEX=$[${#ARRAY[*]}-1]
for I in `seq 0 $INDEX`;do
if [ $MAX -lt ${ARRAY[$I]} ] ;then
MAX=${ARRAY[$I]}
fi
done
echo $MAX
[root@mail ~]# sh max.sh
20243 14152 4615 ^CNo quit...
14060 1666 11082 ^CNo quit...
14121 5548 13252 32509
32509
信号捕捉-多命令
[root@mail ~]# cat mu.sh
#!/bin/bash
trap 'rm -rf /var/tmp/test;echo "clean...";exit 5' INT
mkdir -p /var/tmp/test
while true; do
touch /var/tmp/test/file-`date +%F-%H-%M-%S`
sleep 2
done
多个命令用分号分隔
关键字词:linux,bash,数组