[Расширенные знания по эксплуатации и техническому обслуживанию] Супер подробное объяснение программирования Shell 5 (обычный массив + ассоциативный массив + лотерейный проект)

Эта статья продолжает знакомить вас с программированием в Shell и знакомит с материалами, связанными с массивами.Благодаря предыдущему контенту вы можете выполнить большинство требований в Shell.

Оглавление

множество

1. Обычный массив

1. Грамматическая структура

2. Метод определения массива

3. Пропингуйте следующие IP-адреса, чтобы проверить, можно ли их пропинговать (значение, определенное массивом, извлекается циклом for)

2. Ассоциативные массивы

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-летним опытом эксплуатации и обслуживания, и продолжаю делиться галантереей в эксплуатации и обслуживании.Спасибо за чтение и внимание!

 

Supongo que te gusta

Origin blog.csdn.net/qq_37510195/article/details/130739023
Recomendado
Clasificación