Эта статья продолжает знакомить вас с программированием в Shell и знакомит с материалами, связанными с массивами.Благодаря предыдущему контенту вы можете выполнить большинство требований в Shell.
Оглавление
1. Определите количество мужчин и женщин в тексте
2. Подсчитайте количество вхождений IP
множество
Предыдущая переменная похожа на коробку, содержащую одну вещь, а массив эквивалентен одной коробке, содержащей несколько маленьких коробок, а в маленьких коробках лежат вещи, и каждая вещь имеет номер
1. Обычный массив
В качестве индексов могут использоваться только целые числа (имена элементов, также называемые нижними индексами).
1. Грамматическая структура
数组名称[元素名称]=元素的值
2. Метод определения массива
1. По определению индекса
[root@Web01 ~]# array[0]=shell
[root@Web01 ~]# array[1]=mysql
[root@Web01 ~]# array[2]=docker
Посмотреть значение массива
[root@Web01 ~]# echo ${array[0]}
shell
[root@Web01 ~]# echo ${array[1]}
mysql
[root@Web01 ~]# echo ${array[2]}
docker
[root@Web01 ~]# echo ${array[*]}
shell mysql docker
[root@Web01 ~]# echo ${array[@]}
shell mysql docker
Просмотр индекса массива (индекс, имя элемента)
[root@Web01 ~]# echo ${!array[*]}
0 1 2
отменить массив
[root@Web01 ~]# unset array
[root@Web01 ~]# echo ${!array[*]}
[root@Web01 ~]#
2. Определение прямого присвоения
Обратите внимание, что индекс по умолчанию начинается с 0
[root@Web01 ~]# array=(shell test hehe docker k8s)
[root@Web01 ~]# echo ${!array[*]}
0 1 2 3 4
[root@Web01 ~]# echo ${array[*]}
shell test hehe docker k8s
3. Гибридное определение
[root@Web01 ~]# array=([5]=shell test hehe docker [20]=k8s)
[root@Web01 ~]# echo ${!array[*]}
5 6 7 8 20
[root@Web01 ~]# echo ${array[*]}
shell test hehe docker k8s
4. Поддержка определения значения команды
[root@Web01 ~]# array=(`echo shell mysql redis`)
[root@Web01 ~]# echo ${array[*]}
shell mysql redis
[root@Web01 ~]# echo ${!array[*]}
0 1 2
3. Пропингуйте следующие IP-адреса, чтобы проверить, можно ли их пропинговать (значение, определенное массивом, извлекается циклом for)
10.0.0.2
10.0.0.4
202.106.0.20
114.114.114
223.5.5.5
8.8.8.8
Его можно пройти, взяв значение массива
[root@LB00 Day05]# cat ping.sh
#!/bin/basha
ip=(
10.0.0.2
10.0.0.4
202.106.0.20
114.114.114
223.5.5.5
8.8.8.8
1.5.4.9
)
for i in ${ip[*]}
do
ping -c1 -W1 $i &> /dev/null
if [ $? == 0 ];then
echo $i 可以通
else
echo $i 不通
fi
done
[root@LB00 Day05]# sh ping.sh
10.0.0.2 可以通
10.0.0.4 可以通
202.106.0.20 不通
114.114.114 不通
223.5.5.5 可以通
8.8.8.8 可以通
1.5.4.9 不通
Вы также можете пройти, индексируя
[root@LB00 Day05]# cat ping.sh
#!/bin/basha
ip=(
10.0.0.2
10.0.0.4
202.106.0.20
114.114.114
223.5.5.5
8.8.8.8
1.5.4.9
)
for i in ${!ip[*]}
do
ping -c1 -W1 ${ip[$i]} &> /dev/null
if [ $? == 0 ];then
echo ${ip[$i]} 可以通
else
echo ${ip[$i]} 不通
fi
done
[root@LB00 Day05]# sh ping.sh
10.0.0.2 可以通
10.0.0.4 可以通
202.106.0.20 不通
114.114.114 不通
223.5.5.5 可以通
8.8.8.8 可以通
1.5.4.9 不通
2. Ассоциативные массивы
может быть проиндексирован строкой
Метод определения такой же, как и у обычного массива, и строковый массив его не распознает, поэтому по умолчанию он равен 0.
[root@LB00 Day05]# array[index1]=shell
[root@LB00 Day05]# array[index2]=mysql
[root@LB00 Day05]# array[index3]=redis
[root@LB00 Day05]# echo ${array[*]}
redis
[root@LB00 Day05]# echo ${!array[*]}
0
Объявлен как ассоциативный массив, пусть строка распознает
[root@LB00 Day05]# unset array
[root@LB00 Day05]# declare -A array
[root@LB00 Day05]# array[index1]=shell
[root@LB00 Day05]# array[index2]=mysql
[root@LB00 Day05]# array[index3]=redis
[root@LB00 Day05]# echo ${array[*]}
shell mysql redis
[root@LB00 Day05]# echo ${!array[*]}
index1 index2 index
1. Определите количество мужчин и женщин в тексте
[root@LB00 Day05]# cat xingbie.txt
boy
girl
boy
boy
girl
xxx
[root@LB00 Day05]# declare -A array
[root@LB00 Day05]# let array[boy]++ #通过数组元素值自增去判断数量
[root@LB00 Day05]# echo ${array[boy]} #就是元素值是数字,下标是文字
1
[root@LB00 Day05]# let array[boy]++
[root@LB00 Day05]# echo ${array[boy]}
2
[root@LB00 Day05]# cat array.sh
#!/bin/bash
declare -A array
while read line
do
let array[$line]++
done<xingbie.txt
for i in ${!array[*]}
do
echo $i 出现了 ${array[$i]} 次
done
[root@LB00 Day05]# sh array.sh
xxx 出现了 1 次
girl 出现了 2 次
boy 出现了 3 次
2. Подсчитайте количество вхождений IP
[root@LB00 Day05]# cat count_ip.sh
#!/bin/bash
declare -A array
while read line
do
ip=`echo $line|awk '{print $1}'`
let array[$ip]++
done</var/log/nginx/access.log
for i in ${!array[*]}
do
echo $i 出现了 ${array[$i]} 次
done
[root@LB00 Day05]# sh count_ip.sh
172.16.1.5 出现了 207 次
лотерейный проект
нуждаться:
1. Введите имя, и после имени появится случайное число от 1 до 100.
2. Цифры, которые появились, больше не могут появляться
3. ТОП-рейтинг последнего случайного числа
[root@LB00 Day05]# cat zhuajiu.sh
#!/bin/bash
while true
do
menu(){
echo -e "\t\t\t\033[31m 1.抓阄 \033[0m"
echo -e "\t\t\t\033[32m 2.当前排名 \033[0m"
}
menu
read -p "请输入模式的编号[1|2]: " moshi
case $moshi in
1)
read -p "请输入你的姓名: " name
while true
do
ran=`echo $((RANDOM%100+1))`
if [ -f ran.txt ];then
if [ `grep -w $ran ran.txt|wc -l` == 1 ];then
continue
else
echo $name $ran >> ran.txt
break
fi
else
echo $name $ran >> ran.txt
break
fi
done
echo 名字为 $name 号码为 $ran
;;
2)
echo 抓阄排行如下
if [ -f ran.txt ];then
sort -rnk2 ran.txt
else
echo 当前还没有排名
fi
;;
*)
echo "Usage: [1|2]"
esac
done
[root@LB00 Day05]# sh zhuajiu.sh
1.抓阄
2.当前排名
请输入模式的编号[1|2]: 1
请输入你的姓名: q
名字为 q 号码为 32
1.抓阄
2.当前排名
请输入模式的编号[1|2]: 1
请输入你的姓名: w
名字为 w 号码为 55
1.抓阄
2.当前排名
请输入模式的编号[1|2]: 1
请输入你的姓名: e
名字为 e 号码为 51
1.抓阄
2.当前排名
请输入模式的编号[1|2]: 2
抓阄排行如下
w 55
e 51
q 32
1.抓阄
2.当前排名
请输入模式的编号[1|2]: ^Z
[17]+ Stopped sh zhuajiu.sh
Я котен, с 10-летним опытом эксплуатации и обслуживания, и продолжаю делиться галантереей в эксплуатации и обслуживании.Спасибо за чтение и внимание!