Shell编程——数组

定义

singer=("renxiaojing" "hehaotian" "zhangyangchong" "panlinfeng")

 基本用法

[root@sanchuang ~]# singer=("renxiaojing" "hehaotian" "zhangyangchong" "panlinfeng")
[root@sanchuang ~]# echo ${singer[0]}   输出数组下标为1的内容
renxiaojing
[root@sanchuang ~]# echo ${singer[1]}
hehaotian
[root@sanchuang ~]# singer[4]="machi" 
[root@sanchuang ~]# echo ${singer[4]}
machi
[root@sanchuang ~]# echo ${singer[@]} 获取所有的元素的内容   等同于 echo ${singer[*]}
renxiaojing hehaotian zhangyangchong panlinfeng machi
[root@sanchuang ~]# echo ${#singer[@]}  获取数组元素的个数
5
[root@sanchuang ~]# sg="caojiangbei"
[root@sanchuang ~]# echo ${#sg}   获取变量的长度(字符串的个数)
11
[root@sanchuang ~]# echo $sg
caojiangbei
[root@sanchuang ~]# echo $sg|wc -L
11

 输出数组的索引

[root@sanchuang ~]# echo ${!singer[@]}   输出数组的索引
0 1 2 3 4
[root@sanchuang ~]# 
[root@sanchuang ~]# unset singer[2]    删除singer数组下标为2的值
[root@sanchuang ~]# echo ${!singer[@]}    
0 1 3 4                                可以看到删除下标为2的值之后,数组的索引中也没了2
[root@localhost ~]# [[  ${selected[*]}  =~ "小明" ]]  判断小明是否在selected数组内 
[root@localhost ~]# echo $?     查看上以条命令是否执行成功,为0则执行成功,非0则失败
0

添加元素

selected+=($student)   在数组的末尾添加一个元素

$?  获取脚本最后一次的返回值

$$  获取当前脚本的PID

$0  获取文件名,地址路径

$1  位置变量1

$@  不加引号,获取参数。加引号,把每个参数看作一份数据

$#  获取参数的个数

!123  执行历史记录中的第123条命令

$n  获取第几个参数

$*  不加引号,获取参数。加引号,把所有参数看作一份数据

$!  获取上一次后台执行进程的PID

$_  获取上一次命令的最后一个参数


练习:

随机抽取人唱歌歌,抽过的人不能重复抽(用数组完成)
 

#!/bin/bash
# 学生名单
students=("小明" "小红" "小刚" "小美" "小雨" "小亮")
# 已经抽取的人
selected=()
while true
do
  # 判断是否所有人都已经抽取过
  if [ ${#selected[@]} -eq ${#students[@]} ]; then
    echo "所有人都已经抽取过了,重新开始!"
    selected=()
  fi
  # 从学生名单中随机抽取一个人
  idx=$(( RANDOM % ${#students[@]} ))
  student=${students[$idx]}
  # 判断这个人是否已经抽取过
  if [[ "${selected[*]}" =~ "${student}" ]]; then
    continue
  fi
  # 输出抽取的结果
  echo "恭喜 ${student} 抽中了!"
  # 记录已经抽取的人
  selected+=($student)
  read -p "请继续抽奖"
  echo  "${selected[*]}"
done

拓展:

编写一个点歌程序(抽奖程序): super_singer.sh
1.学生名单和歌曲名单(曲库)
2.抽奖程序
抽奖程序需要从学生名单里随机抽取人,从歌曲名单里随机抽取歌曲,对应输出某同学唱某歌,抽取过的人和歌曲都下次不能再抽取,当所有的人都抽取完成后,重新开始,所有的歌曲抽完了也重新开始

方法一:

#!/bin/bash

sum=`cat ~/shell/while/name.txt | wc -l`
song=`cat ~/shell/while/song_name.txt | wc -l`

while :
do

if [ $sum -eq `cat ~/shell/old_name.txt | wc -l` ];then
        echo "全部人都已经表演完毕了!!!"
        >~/shell/old_name.txt
        break
fi

if [ $song -eq `cat ~/shell/old_song_name.txt | wc -l` ];then
        echo "歌曲已经全部唱完了!!!"
        >~/shell/old_song_name.txt
        break
fi

name_random=`expr $RANDOM % 18 + 1`
singer_name=`cat ~/shell/while/name.txt | awk 'NR=='$name_random'{print $1}'`

song_random=`expr $RANDOM % 100 + 1`
song_name=`cat ~/shell/while/song_name.txt | awk 'NR=='$song_random'{print $1}'`

if grep "$singer_name" ~/shell/old_name.txt &> /dev/null ;then
	continue
else
	if grep "$song_name" ~/shell/old_song_name.txt &> /dev/null ;then
                continue
        else
		echo $singer_name >>~/shell/old_name.txt
                echo $song_name >>~/shell/old_song_name.txt
                echo " 有请 $singer_name 上台歌唱 $song_name "
		continue
	fi
fi

done

方法二:

[root@service shell]# cat super_singer.sh 
#!/bin/bash

#学生名单
students=($(cat students.txt))
#歌曲名单
songs=()
while read song
do
	songs+=($song)
done <songs.txt

#设置已经抽取过的人和歌曲
selected_students=()
selected_songs=()

while true
do
	#判断是否所有人都已经抽取过了
	if (( ${#selected_students[*]} == ${#students[*]} )) || (( ${#selected_songs[@]} == ${#songs[@]} ));then
		echo "所有人或所有歌曲都已经抽取过了,重新开始!"
    		selected_students=()
		selected_songs=()
		read -p "回车重新开始!"
	fi
	
	# 从学生名单和歌曲名单中随机抽取一个
  	idstu=$(( RANDOM % ${#students[@]} ))
  	student=${students[$idstu]}
	idsong=$(( RANDOM % ${#songs[@]} ))
  	song=${songs[$idsong]}
  	# 判断这个人是否已经抽取过、歌曲是否已经抽取过
  	if [[ "${selected_students[*]}" =~ "${student}" ]] || [[ "${selected_songs[*]}" =~ "${song}" ]]; then
    		continue
  	fi

	# 输出抽取的结果
  	echo "恭喜 ${student} 抽中了歌曲 ${song}!"
  	# 记录已经抽取的人
  	selected_students+=($student)
	selected_songs+=($song)
  	
	#输出已经抽取的名单
	echo  "${selected_students[*]}"
	echo  "${selected_songs[*]}"
	read -p "请继续抽奖"
done

substr(s, i [, n])

$time_iso8601|$host|$http_cf_connecting_ip|$request|$status|$body_bytes_sent|$http_referer|$http_user_agent
-------------------------------------
2019-04-25T09:51:58+08:00|a.google.com|47.52.197.27|GET /v2/depth?symbol=aaa HTTP/1.1|200|24|-|apple
2019-04-25T09:52:58+08:00|b.google.com|47.75.159.123|GET /v2/depth?symbol=bbb HTTP/1.1|200|407|-|python-requests/2.20.0
2019-04-25T09:53:58+08:00|c.google.com|13.125.219.4|GET /v2/ticker?timestamp=1556157118&symbol=ccc HTTP/1.1|200|162|-|chrome
2019-04-25T09:54:58+08:00|d.shuzibi.co|-||HEAD /justfor.txt HTTP/1.0|200|0|-|-
2019-04-25T09:55:58+08:00|e.google.com|13.251.98.2|GET /v2/order_detail?apiKey=ddd HTTP/1.1|200|231|-|python-requests/2.18.4
2019-04-25T09:56:58+08:00|f.google.com|210.3.168.106|GET /v2/trade_detail?apiKey=eee HTTP/1.1|200|24|-|-
2019-04-25T09:57:58+08:00|g.google.com|47.75.115.217|GET /v2/depth?symbol=fff HTTP/1.1|200|397|-|python-requests/2.18.4
2019-04-25T09:58:58+08:00|h.google.com|47.75.58.56|GET /v2/depth?symbol=ggg HTTP/1.1|200|404|-|safari
2019-04-25T09:59:58+08:00|i.google.com|188.40.137.175|GET /v2/trade_detail?symbol=hhh HTTP/1.1|200|6644|-|-
2019-04-25T10:01:58+08:00|j.google.com|2600:3c01:0:0:f03c:91ff:fe60:49b8|GET /v2/myposition?apiKey=jjj HTTP/1.1|200|110|-|scan


1、计算每分钟的带宽(body_bytes_sent)
cat nginx.log |awk -F'|' '{network[substr($1,1,16)]+=$6}END{for (i in network) print i,network[i]}'

2、统计每个URI(即不带问号?后面的内容)的每分钟的频率
netstat -anplut
  Proto Recv-Q Send-Q Local Address               Foreign Address             State
  tcp        0      0 172.16.18.227:38734         172.16.10.25:5921           ESTABLISHED 
  tcp        0      0 172.16.18.227:33046         172.16.17.83:5921           ESTABLISHED 
  tcp        0      0 127.0.0.1:38978             127.0.0.1:12321             TIME_WAIT   
  tcp        0      0 127.0.0.1:38990             127.0.0.1:12321             TIME_WAIT     
  tcp        0      0 127.0.0.1:3306              127.0.0.1:35422             ESTABLISHED 
  tcp        0      0 127.0.0.1:38912             127.0.0.1:12321             TIME_WAIT  


3、统计每个state的数量

     

Return  the  at  most  n-character  substring of s starting at i.  If n is
                               omitted, use the rest of s.
s是我们的字符串
i是从第i个字符开始
n表示截取的字符串的长度
substr($1,1,4) 从第1个字符开始,连续截取4个字符

substr($1,3,5)  从第3个字符开始,连续截取5个字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值