定义
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个字符