函数+循环(栗子)

循环1-100累加

[root@m01 scripts]# cat 1-100.sh 
#!/bin/bash
sum=0
for (( i=1; i<=100; i++ ))
do
	((sum+=i))
done
echo $sum	

while读取文件部分内容累加

[root@m01 scripts]# cat stu.txt 
01 oldbing  18
02 oldxia   19
03 oldlidao 19
04 oldguo   66

[root@m01 scripts]# cat while-stu.sh 
#!/bin/bash
sum=0
file=/server/scripts/stu.txt
while read line
do
i=`echo $line | awk '{print $3}'`
((sum+=i))
done <$file
echo $sum

netstat -ant
ss -ant

函数

[root@m01 scripts]# cat 1-15hanshu.sh 
#!/bin/bash
print() {
name=$1
echo "${name}今天15号了"
echo "${name}调用函数"
echo "${name}函数执行过程"
echo $0
echo $#
echo $*
}
print {a..z}

###企业案例:写一个Shell脚本解决类DDOS攻击的生产案例。请根据web日志或者或者系统网络连接数,监控当某个IP并发连接数,若短时内并发连接数达到100(阈值),即调用防火墙命令封掉对应的IP。防火墙命令为:iptables -I INPUT -s IP地址 -j DROP。
分析:
1.通过awk分析日志、连接数 每个ip的次数 结果存放在文件中
2.通过while read line 读取文件
1) 判断次数如果大于100 则封掉

```l
#!/bin/bash
file=/server/scripts/netstat.log
tmp_file=/server/scripts/tmp.txt
awk -F'[ :]+' '/ESTABLISHED/{print $6}' $file|sort |uniq -c >$tmp_file

while read line
do
cnt=`echo $line|awk '{print $1}'`
ip=`echo $line|awk '{print $2}'`
if [ $cnt -ge 2 ]
then
  iptables -I INPUT -s $ip -j DROP
fi
done <$tmp_file
[root@m01 scripts]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  123.6.8.223          0.0.0.0/0           
DROP       all  --  123.244.104.42       0.0.0.0/0           
DROP       all  --  121.204.108.160      0.0.0.0/0           
DROP       all  --  118.242.18.177       0.0.0.0/0           
DROP       all  --  114.250.252.127      0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
2020年 01月 15日 星期三 15:30:24 CST

iptables -F清空防火墙
在这里插入图片描述
使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件

[root@m01 scripts]# cat sun.sh 
#!/bin/bash
dir=/sun/
[ ! -d $dir ] && mkdir -p $dir

for i in `seq 10`
do 
	touch $dir`echo $RANDOM |md5sum |cut -c 1-10`_sun.html
done
ll /sun

在这里插入图片描述

[root@m01 scripts]# date +%N|md5sum|cut -c 1-8
083d6859
[root@m01 scripts]# echo $((RANDOM + 100000000 ))
100018493

删除所有只剩小写字符
在这里插入图片描述
批量创建文件(纯字母)

#!/bin/bash
dir=/sun
[ ! -d $dir ] && mkdir -p $dir

for i in `seq 10`
do
name=`tr -cd 'a-zA-Z' </dev/urandom |head -c 10`
	touch $dir/${name}_sun.html
done

将创建好的文件名中的sun替换为www

[root@m01 scripts]# cat tihuan.sh 
#!/bin/bash
cd /sun
for n in `ls *.html`
do 
mv $n ${n/sun/www}
done

批量创建用户
在这里插入图片描述

[root@m01 scripts]# cat user.sh 
#!/bin/bash
for n in oldboy{01..10}
do 
useradd $n
password=`tr -cd 'a-zA-Z' </dev/urandom |head -c8`
echo "$password"|passwd --stdin $n
echo $n $pass >> /root/pass.txt
done

在这里插入图片描述

checkpid() {
    local i    #设置局部变量i 

    for i in $* ; do        #函数所有参数 循环  
        [ -d "/proc/$i" ] && return 0
    done
    return 1
}


函数checkpid 
checkpid  
如果这个pid存在   return 0 

[root@manager ~]# . /etc/init.d/functions 
[root@manager ~]# checkpid 7541 7055 7052
[root@manager ~]# ll -d /proc/7541/
dr-xr-xr-x 9 root root 0 1月  16 08:41 /proc/7541/
[root@manager ~]# ll -d /proc/7541/   /proc/7055  /proc/7052 
dr-xr-xr-x 9 root root 0 1月  16 08:34 /proc/7052
dr-xr-xr-x 9 root root 0 1月  16 08:34 /proc/7055
dr-xr-xr-x 9 root root 0 1月  16 08:41 /proc/7541/


#continue 基本含义 
[root@manager ~]# for n in  {1..10}; do [ $n -eq 5 ] &&continue ; echo $n  ;done 
1
2
3
4
6
7
8
9
10


  for pid in $pids ; do
        [ ! -e  "/proc/$pid" ] && continue   #如果pid目录不存在 则跳过本次循环 读取下1个pid目录 
        read -r line < "/proc/$pid/stat" 2> /dev/null

        stat=($line)
        stime=${stat[21]}

        [ -n "$stime" ] && [ "$base_stime" -lt "$stime" ] && continue
        remaining+="$pid "
    done


#break 基本含义
[root@manager ~]# for n in  {1..10}; do [ $n -eq 5 ] &&break ; echo $n  ;done 
1
2
3
4



[ -z "$kill_list" ] && break
[ -z "$line" ] && break

九九乘法表

[root@m01 scripts]# cat 99.sh 
#!/bin/bash
for (( i=1; i<=9; i++ ))
do
  for (( j=1; j<=i; j++ ))
  do
    (( k=$i*$j ))
    echo -n "$j" "*" "$i" "=" "$k   "   
  
    done
    echo 
done
[root@m01 scripts]# sh 99.sh
1 * 1 = 1   
1 * 2 = 2   2 * 2 = 4   
1 * 3 = 3   2 * 3 = 6   3 * 3 = 9   
1 * 4 = 4   2 * 4 = 8   3 * 4 = 12   4 * 4 = 16   
1 * 5 = 5   2 * 5 = 10   3 * 5 = 15   4 * 5 = 20   5 * 5 = 25   
1 * 6 = 6   2 * 6 = 12   3 * 6 = 18   4 * 6 = 24   5 * 6 = 30   6 * 6 = 36   
1 * 7 = 7   2 * 7 = 14   3 * 7 = 21   4 * 7 = 28   5 * 7 = 35   6 * 7 = 42   7 * 7 = 49   
1 * 8 = 8   2 * 8 = 16   3 * 8 = 24   4 * 8 = 32   5 * 8 = 40   6 * 8 = 48   7 * 8 = 56   8 * 8 = 64   
1 * 9 = 9   2 * 9 = 18   3 * 9 = 27   4 * 9 = 36   5 * 9 = 45   6 * 9 = 54   7 * 9 = 63   8 * 9 = 72   9 * 9 = 81   

输出加特效
在这里插入图片描述

[root@manager ~]# echo -e "\E[5;32;41m红色字oldboy\E[0m"
红色字oldboy

99加颜色

#!/bin/bash
for (( i=1; i<=9; i++ ))
do
  for (( j=1; j<=i; j++ ))
  do
    (( k=$i*$j ))
    echo -ne "\E[5;31;40m"$j" "*" "$i" "=" "$k  "\E[0m"   

    done
    echo 
done

在这里插入图片描述
输出内容加颜色(函数+case)

[root@manager ~]# cat /server/scripts/2.18.1-color.sh
#!/bin/bash

#author:oldboy
RED="\E[1;31m"
GREEN="\E[1;32m"
BLUE="\E[1;34m"
END="\E[0m"
input() {
cat <<EOF
1.input red 内容

2.input green 内容

3.input blue  内容
EOF
read -p "input choice:" cho
read -p "内容:" text
}

choice() {
case "$cho" in 
    1)
      echo -e "${RED} $text ${END}"
      ;;
    2)
      echo -e "${GREEN} $text ${END}"
      ;;
    3)
      echo -e "${BLUE} $text ${END}"
      ;;
    *)
      echo "Usage: input {1|2|3}"
      exit 1
esac
}
main() {
    input
    choice

}

main

在这里插入图片描述
在这里插入图片描述
:set cursorline vim中给光标加下划线
数组---------数组名[元素|下标]

[root@m01 scripts]# sun=(123 wer ddd)T
[root@m01 scripts]# echo ${sun[1]}
wer
[root@m01 scripts]# echo ${sun[2]}
ddd
[root@m01 scripts]# echo ${sun[0]}
123
[root@m01 scripts]# echo ${sun[*]}
123 wer ddd

通过文件给数组赋值并计算下标个数
在这里插入图片描述
数组的赋值方式
在这里插入图片描述
检查ip 是否ping的通
在这里插入图片描述

[root@m01 scripts]# cat ip_list.txt 
10.0.0.61
10.0.0.71
10.0.0.81
10.0.0.202
2020年 01月 16日 星期四 11:46:23 CST
[root@m01 scripts]# cat check_ip.sh 
#!/bin/bash
##############################################################
# File Name: check_ip.sh
# Version: V1.0
# Author: oldboy
# Organization: www.oldboyedu.com
# Created Time : 2020-01-16 11:40:46
# Description:
##############################################################
ip_list=( `cat /server/scripts/ip_list.txt` )

check_ip() {
ping -c1 -i1 -W1 $ip &>/dev/null
	if [ $? -eq 0 ];then
	echo "$ip is ok"
	else
	echo "$ip is failed"
	fi
}
main() {
for ip in ${ip_list[*]}
do 
	check_ip
done
}
main
2020年 01月 16日 星期四 11:46:34 CST
[root@m01 scripts]# sh check_ip.sh
10.0.0.61 is ok
10.0.0.71 is failed
10.0.0.81 is failed
10.0.0.202 is failed

vimrc家目录配置

[root@m01 ~]# cat ~/.vimrc 
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"

func SetTitle()  
    if expand("%:e") == 'sh'  
        call setline(1,"#!/bin/bash")
        call setline(2, "##############################################################")  
        call setline(3, "# File Name: ".expand("%"))
        call setline(4, "# Version: V1.0")
        call setline(5, "# Author: oldboy")
        call setline(6, "# Organization: www.oldboyedu.com")
        call setline(7, "# Created Time : ".strftime("%F %T"))
        call setline(8, "# Description:")
        call setline(9, "##############################################################")
        call setline(10, "")
    endif  
endfunc

sed循环回车转换成空格
在这里插入图片描述

[root@manager ~]# tr '\n' ' '  <num.txt
1 2 3 4 5 6 7 8 9 10 [root@manager ~]# 
[root@manager ~]# xargs  <num.txt
1 2 3 4 5 6 7 8 9 10
[root@manager ~]# awk -vORS=" "  '1' num.txt
1 2 3 4 5 6 7 8 9 10 [root@manager ~]#
正则VS通配符

在这里插入图片描述

取:右边的内容

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

**用perl正则(零宽断言)**取:右边内容
[root@m01 scripts]# cat id.txt |grep -Po '(?<=:)[0-9]+'
1
999
12306
996

取:左边内容
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值