Shell编程

39 篇文章 0 订阅
5 篇文章 0 订阅

shell编程

标准

注释使用

头部加上解释环境 #!/usr/bin/bash

脚本信息

Author:
Created Time:
Release:
Script Description:

运行脚本

1、给执行权限
hello.sh

#! /usr/bin/bash
echo "Hello word"

执行

赋权限
chmod 700 hello.sh
./hello.sh

2、解释器直接执行,不需要给权限

bash hello.sh

>、>>、2>、2>>、&>、&>>

>	正确覆盖
>>		正确追加
2>		错误覆盖
2>>		错误追加
&>		正确错误覆盖
&>>		正确错误追加

算术计算

expr

[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# expr 1 + 2
3
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# expr 9+2
9+2
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# expr 9 + 2
11
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# expr 9 - 3
6
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# expr 9 * 3
expr: syntax error
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# expr 9 \* 3
27
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# expr 9 / 3
3
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# expr 9 / 4
2
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# echo $?  # 判断上条命令执行是否正确,返回0,则为正确
0
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# expr 8 + 9 &>/dev/null ; echo $?		# /dev/null是回收站位置, 8 + 9 &>/dev/null意思是将8+9结果输入到/dev/null。并且判断echo $?,这条命是否成功。
0
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# expr 8 + 9.9 &>/dev/null ; echo $?
2

bc

[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
ls
0
9+8
17
9-8
1
9*9
81
9/7
1
9%4
1

scale=3		# 指定保留小数位数 
8/3
2.666
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# echo "scale=2;289/23481*1000"|bc
10.00
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# echo "内存使用率:`echo "scale=2;289/23481*1000"|bc`"
内存使用率:10.00
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# echo "内存使用率:`echo "scale=2;289/23481*1000"|bc`%"
内存使用率:10.00%

$(())

[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# echo $((3+4))7
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# echo $((3-4))
-1
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# echo $((3*4))
12
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# echo $((3/4))
0
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# echo $((3%4))
3

$? 判断是否为0来判断命令是否执行成功

说明:可以使用$?来判断原因是因为在脚本最后加了exit num num的范围是1-255
新建exit.sh文件

[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# ls
exit.sh  f1  f2  hello.sh
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# cat exit.sh
#! /usr/bin/bash
echo "输出exit"
exit 127
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# bash exit.sh
输出exit
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# echo $?
127

echo输出

命令选项

-n 不要在最后自动换行
-e 字符串中出现转义字符,会做特别处理

转义字符

\a	发出警告声
\b	删除前面的字符
\t	插入tab键

\c	最后不加上换行符
\f	换行但光标仍停留在原来的位置
\r	光标移至行首,但不换行
\v	与\f相同
\	插入\字符
\nnn	插入nnn(八进制)所代表的ACII字符
[root@iZbp1d6ukr7d6j6eosyixaZ log]# echo -n "Login:";read
Login:xxx^C
[root@iZbp1d6ukr7d6j6eosyixaZ log]# echo -e "\a\a\a\a\a\a\a\a"

[root@iZbp1d6ukr7d6j6eosyixaZ log]# echo -e "\t\t\t\t\tTest"
     Test
[root@iZbp1d6ukr7d6j6eosyixaZ log]# echo -e "\n\n\n\nTest"




Test

倒计时time.sh

#! /bin/bash
for time in `seq 9 -1 0`;do
        echo -n "\b$time"
        sleep 1
done
echo
#! /bin/bash
for time in `seq 9 -1 0`;do
        echo -n -e "\b$time"
        sleep 1
done
echo

案例2

[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# vim docker.sh
#! /bin/bash

echo -e "\t\t\t\t\t\t\t\t 欢迎使用Docker"
echo -e "\t1>Nginx"
echo -e "\t2>Tomcat"
echo -e "\t3>Mysql"
~
~
"docker.sh" 6L, 121C written
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# bash docker.sh
         欢迎使用Docker
 1>Nginx
 2>Tomcat
 3>Mysql
颜色代码
echo -e "\033[背景颜色;字体颜色 字符串 \033[属性效果"
[root@iZbp1d6ukr7d6j6eosyixaZ /]# echo -e "\033[42;33m 黄色文字 \033[0m"
 黄色文字 

对应颜色码参考:https://www.cnblogs.com/linusflow/p/7399761.html

程序交互 read

语法:read [选项] 变量名

read命令选项

-e :在输入的时候可以使用命令补全功能
-p	后面跟提示信息,即在输入前打印提示信息
-t	限定时间 (限制用户输入字符的时间,超过则自动关闭)
-s	不显示用户输入的内容(比如输入密码)
-n	限制输入字符个数
#! /bin/bash
read -p "请输入名字:" name
read -p"请输入密码:" passwd
echo -e  "输入的名字:$name\t\t\t\t\t输入的密码:$passwd"


[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# bash bs_demo01.sh
请输入名字:name
请输入密码:passwd
输入的名字:name     输入的密码:passwd
#! /bin/bash

echo -e -n "Login:"
read lg
echo -e -n "Password:"
read -s -t5 -n5 pw

echo "name:   $lg   password:    $pw"
~


[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# bash comm.sh
Login:login
Password:123456
name:   login   password:    123456

变量

变量分类

在这里插入图片描述

初始化变量

you_name = "name"
echo $you_name

只读变量 readonly

num = 123
readonly num

删除变量
unset your_name (不能删除只读变量)
加载变量
使用soure加载拥有私有变量的变量文件,可以使得变量变成全局变量。

变量的基本类型

字符串:
拼接字符串:greeting="hello,"$you_name"!"

数组

数组 arry_name=(value1 value2 value3)
取数组 value=${array_name[n]}
单独赋值 array_name[0]=value0
在这里插入图片描述

[root@iZbp1d6ukr7d6j6eosyixaZ ~]# arr_name=(a b c d e f )
[root@iZbp1d6ukr7d6j6eosyixaZ ~]# ${arr_name[0]}
bash: a: command not found
[root@iZbp1d6ukr7d6j6eosyixaZ ~]# echo ${arr_name[0]}
a
[root@iZbp1d6ukr7d6j6eosyixaZ ~]# echo ${arr_name[@]}
a b c d e f
[root@iZbp1d6ukr7d6j6eosyixaZ ~]# echo ${#arr_name[@]}
6
[root@iZbp1d6ukr7d6j6eosyixaZ ~]# echo ${!arr_name[@]}
0 1 2 3 4 5
[root@iZbp1d6ukr7d6j6eosyixaZ ~]# echo ${arr_name[@]:1}
b c d e f
[root@iZbp1d6ukr7d6j6eosyixaZ ~]# echo ${arr_name[@]:1:3}
b c d
关联数组

语法:declare -A 数组名

#! /bin/bash

declare -A arr

arr[name]=Tom
arr[age]=3
arr[sex]=m

echo ${arr[name]}
echo ${arr[age]}
echo ${arr[sex]}

echo ${arr[@]}
echo ${arr[*]}
echo ${arr[@]:3}
echo ${#arr[@]}
echo ${!arr[@]}
#! /bin/bash

# 声明一个关联数组
declare -A arr01
declare -A arr02

arr01[name]="Tom"
arr01[age]=7

echo ${arr01[name]}

arr02=([name]='Jim' [age]=2)	# 一次复制
echo ${arr02[name]} 	# 取值
~

[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# bash arr.sh
Tom
Jim

基本数组和关联数组的区别:关联数组可以自定义下标,普通数组是0开始自加。

运算

-eq  检测相等  [ $a -eq $b ]  	相等
-ne  检测不相等  [ $a -ne $b ]	不等
-gt  检测左边的是否大于右边  [ $a -gt  $b ]		大于
-lt  检测左边的是否小于右边  [ $a -lt $b ]		小于
-ge  检测左边的是否大于等于右边  [ $a -ge $b ]		大于等于
-le  检测左边的是否小于等于右边  [ $a -le $b ]		小于等于

文件类型的比较
在这里插入图片描述

[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ pwd
/LianXi
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -e /LianXi
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -e /LianXi;echo $?    # 使用test做比较
0
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -f /LianXi;echo $?
1
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -d /LianXi;echo $?
0
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ ls
arr.sh  comm.sh  docker.sh  exit.sh  f2  hello.sh  time.sh
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -d /LianXi/hello.sh;echo $?
1
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -w /LianXi/hello.sh;echo $?
1
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -x /LianXi/hello.sh;echo $?
1
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -r /LianXi/hello.sh;echo $?
1
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -s /LianXi/hello.sh;echo $?
0
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test hello.sh -nt arr.sh;echo $?
1
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test hello.sh -ot arr.sh;echo $?
0

字符串比较运算

[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test $USER == 'root';echo $?
1
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test $USER != 'root';echo $?
0
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -z "";echo $?
0
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -n "";echo $?
1
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -z "ace";echo $?
1
[sunxinyang@iZbp1d6ukr7d6j6eosyixaZ LianXi]$ test -n "ace";echo $?
0
逻辑运算

在这里插入图片描述

流程控制语句

if

语法一

if [条件]
then
	command1
	command2
	.....
fi

例:(注意空格)

if [ $a -eq $c ]; then echo "equal"; elif [ $a -lt $c ]; then echo "small"; elif [ $a -gt $b ]; then echo "big"; fi

例一:判断文件夹是否存在,不存在创建

#! /bin/bash

if [ ! -d /LianXi/mk ]
then
    mkdir /LianXi/mk
    echo "创建文件夹成功!!!"

例二:判断当前用户是否为root,不是给提示

#! /bin/bash

if [ $USER != "root" ]
then
    echo 请使用root账户
    exit 1
fi

语法二:

if [条件]
	then
		command1
else
	command2
	.....
fi

当有多层嵌套的时候

#! /bin/bash

if [ $1 -eq $2 ]
    then
        echo "$1 = $2"
elif [$1 -gt $2 ]
    then
        echo "$1 > $2"
else
    echo "$2 < $1"
fi

#! /bin/bash

if [ $1 -eq $2 ]
    then
        echo "$1 = $2"
else
    if [$1 -gt $2 ]
#! /bin/bash

if [ $1 -eq $2 ]
    then
        echo "$1 = $2"
else
    if [$1 -gt $2 ]
        then
            echo "$1 > $2"
    else
        echo "$2 < $1"
    fi
fi

(())可以直接运算

#! /bin/bash

if ((4>3))
    then
        echo "yes"
else
    echo "no"
fi

for定义

for xx in xxx
do
	cammands
done

例:循环读取文件内容并输出

for i in ${cat file.txt};do echo $i;done

while定义

while 条件
do
	command
done
int=1
while(($int<=5))
do
	echo $int
	let "int++"
done

实例:循环读取文件内容并输出

while read line; do echo $line; done<file.txt

使用for循环读出的文件一行中的空格会换行,while不会。

until循环语句

until介绍

和while正好相反,until是条件为假开始执行,条件为真停止执行。

until语法
until [条件]
	do
		commands
done

例一

#! /bin/bash

num=1
until [ $num -gt 10 ]
   do
        echo $num
        num=$(($num+1))
done
case语句

介绍:对于多种情况下,来判断给出不同的预案。

语法
case  变量	in 
条件1)
		执行代码块1
;;
条件2)
		执行代码块2
;;
条件2)
		执行代码块2
;;
...........
esac
#! /bin/bash

read -p "NUM:" N

case $N in
1)
    echo "数字:1"
;;
2)
    echo "数字:2"
;;
3)
    echo "数字:3"
;;
*)
    echo "数字:....."
;;
esac
特殊变量

在这里插入图片描述

$0	脚本名称
$1-$n	获取参数
$#	传递到脚本的参数
$$	脚本运行的当前进程ID号
$*		以一个单字符串显示所有向脚本传递的参数
$?	显示最后的命令的推出状态。0表示没有错误,其他任何值表明有错误。

案例

#!/bin/bash

echo "脚本的名字:$0"
echo "脚本参数:$*"
echo "传参数量:$#"
echo "脚本执行进程号:$$"
echo "最后执行的命令:$_"
echo "第二个参数是:$2"

执行

[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# bash  ts.sh  aa ss dd ff gg
脚本的名字:ts.sh
脚本参数:aa ss dd ff gg
传参数量:5
脚本执行进程号:28087
最后执行的命令:脚本执行进程号:28087
第二个参数是:ss

shell函数

函数语法
语法一:
函数名 () {
    代码块
    return N
}

语法二:
function  函数名 {
	代码块
	return M
}

实战案例

一、检测一个主机的状态
#! /bin/bash

# 检测一个主机的状态
while ((1));do

for ((i=1;i<4;i++)) {
    if ping -c1 $1 &> /dev/host;then	# -c1 只ping一个host
 export ping_count"$i"=1	# export定义全局变量,set定义局部变量
    else
 export ping_count"$i"=0
    fi
    sleep 1
}

if [ $ping_count1 == $ping_count2 ] && [ $ping_count2 == $ping_count3 ] && [ $p
ing_count1 == 0 ];then
    echo "$1 is down..."
else
    echo "$1 is up!!!"
fi

unset ping_count1
unset ping_count2
unset ping_count3

done

执行

[root@iZbp1d6ukr7d6j6eosyixaZ 案例]# bash ping_host01.sh 127.0.0.1
127.0.0.1 is up!!!
127.0.0.1 is up!!!
127.0.0.1 is up!!!
^C
[root@iZbp1d6ukr7d6j6eosyixaZ 案例]# bash ping_host01.sh 127
127 is down...
127 is down...
127 is down...
127 is down...
^C
[root
二、监控一个服务端口

常用方式

1、systemctl status xxx
2、service xxx status
3、lsof -i  :port
4、ps aux process

5、查看端口是否有响应		# 推荐
	telnet 	协议		需要安装

systemctl status xxx

[root@iZbp1d6ukr7d6j6eosyixaZ admin]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2021-10-26 10:56:34 CST; 1 weeks 3 days ago
     Docs: https://docs.docker.com
 Main PID: 1321 (dockerd).......

service xxx status

[root@iZbp1d6ukr7d6j6eosyixaZ admin]# service docker status
Redirecting to /bin/systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2021-10-26 10:56:34 CST; 1 weeks 3 days ago
     Docs: https://docs.docker.com
 Main PID: 1321 (dockerd),,,,,,

lsof -i :port lsof需要安装

[root@iZbp1d6ukr7d6j6eosyixaZ admin]# lsof -i :80
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
AliYunDun   966 root   22u  IPv4  13262      0t0  TCP iZbp1d6ukr7d6j6eosyixaZ:54328->100.100.30.25:http (ESTABLISHED)
docker-pr 10078 root    4u  IPv4 417181      0t0  TCP *:http (LISTEN)
查看端口是否有响应 telnet 协议

一、安装yum install telnet
通过判断:Escape character is ‘^]’. 中 ‘^]’.来确认是服务是否正常。

[root@iZbp1d6ukr7d6j6eosyixaZ admin]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.	# 正常
^CConnection closed by foreign host.
[root@iZbp1d6ukr7d6j6eosyixaZ admin]# telnet 127.0.0.1 89
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused	# 不正常

二、创建临时文件

mktemp	# 创建临时文件工具
mktemp  port_status.XXX

样例

#! /bin/bash

port_status () {
# 生成一个临时文件
temp_file=`mktemp port_status.XXX`

# 1、判断依赖命令tenlnet是否存在
#[ ! -x /usr/bin/telnet ] && echo "telnet:not found command" && exit 1
if [ ! -x /usr/bin/telnet ]
    then
        echo "telnet:not found command"
        exit 1
fi
# 2、测试端口 $1 IP $2 port
( telnet $1 $2 <<EOF
quit
EOF
) &>$temp_file

# 3、分析文件中的内容,判断结果
if egrep "\^]" $temp_file &>/dev/null;then
    echo "$1 $2 open"
else
    echo "$1 $2 close"
fi
rm -f $temp_file
}

# 注意函数传参
port_status $1 $2

执行

[root@iZbp1d6ukr7d6j6eosyixaZ 案例]# bash port_status.sh 127.0.0.1 80
127.0.0.1 80 open
[root@iZbp1d6ukr7d6j6eosyixaZ 案例]# bash port_status.sh 127.0.0.1 90
127.0.0.1 90 close
[root@iZbp1d6ukr7d6j6eosyixaZ 案例]# bash port_status.sh 127.0.0.1 9090
127.0.0.1 9090 open
三、监控内存使用率
监控命令
free 
cat /proc/meminfo
[root@iZbp1d6ukr7d6j6eosyixaZ 案例]# cat /proc/meminfo
MemTotal:        1776404 kB
MemFree:          137020 kB
MemAvailable:     805632 kB
Buffers:          141704 kB
Cached:           618380 kB
SwapCached:            0 kB
Active:          1194688 kB
Inactive:         284644 kB
Active(anon):     719724 kB
Inactive(anon):      300 kB
Active(file):     474964 kB
Inactive(file):   284344 kB
......

案例

#! /bin/bash

mem_use () {

mem_used=`head -2 /proc/meminfo | awk 'NR==1{t=$2}NR==2{f=$2;print (t-f)*100/t"
%"}'`
mem_cache=`head -5 /proc/meminfo | awk 'NR==1{t=$2}NR==5{c=$2;print c*100/t"%"}
'`
mem_buffer=`head -4 /proc/meminfo | awk 'NR==1{t=$2}NR==4{b=$2;print b*100/t"%"
}'`

echo -e "mem_used:$mem_used\nmem_cache:$mem_cache\nmem_buffer:$mem_buffer"
}
mem_use

运行

[root@iZbp1d6ukr7d6j6eosyixaZ 案例]# bash momery_use.sh
mem_used:92.4706%
mem_cache:34.8166%
mem_buffer:7.9939%
四、Mysql数据库备份

前提
1、mysql的binlog位置/var/lib/mysql

root@a8bd12a1a411:/var/lib/mysql# pwd
/var/lib/mysql
root@a8bd12a1a411:/var/lib/mysql# ls
'#ib_16384_0.dblwr'   binlog.index      ib_logfile1      public_key.pem
'#ib_16384_1.dblwr'   ca-key.pem        ibdata1       server-cert.pem
'#innodb_temp'       ca.pem         ibtmp1       server-key.pem
      client-cert.pem   mysql       sys
 auto.cnf       client-key.pem    mysql.ibd      undo_001
 binlog.000001       ib_buffer_pool    performance_schema   undo_002
 binlog.000002       ib_logfile0       private_key.pem

2、刷新获取最新的binlog文件

mysql -u root -p 密码   # 登录mysql 
mysql -e "flush logs"  # 刷新获取新的binlog.000002文件 
root@dba5ecab9a5a:/# mysql -u root -p123456 -e "flush logs"                   mysql: [Warning] Using a password on the command line interface can be insecure.
root@dba5ecab9a5a:/# mysql -u root -p123456 -e "show master status"| egrep "binlog.[[:digit:]]*" | awk '{print $1}'  
mysql: [Warning] Using a password on the command line interface can be insecure.
binlog.000003	# 获取最新的日志文件

3、ls -a /var/lib/mysql/binlog.000* | tail -1获取最新的日志文件

root@a8bd12a1a411:/var/lib/mysql# ls
 binlog.000001       ib_buffer_pool    performance_schema   undo_002
 binlog.000002       ib_logfile0       private_key.pem
root@a8bd12a1a411:/var/lib/mysql# ls -a /var/lib/mysql/binlog.000* | tail -1
/var/lib/mysql/binlog.000002

或者使用 mysql -e "show master status"获取最新的binlog日志文件

# 获取最新的binlog日志文件
root@dba5ecab9a5a:/# mysql -u root -p123456 -e "show master status"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |      156 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+

root@dba5ecab9a5a:/# mysql -u root -p123456 -e "show master status"| egrep "binlog.[[:digit:]]*" | awk '{print $1}'
binlog.000002
#! /bin/bash
# utf-8

# 将mysql的binlog日志备份到备份服务器

# 思路
# 1确定binlog的位置及备份时间间隔 每天
# 2打包binbinlog日志 以年-月-日_binlog.tar.gz格式
# 3生产校验码 md5sum
# 4将校验码和压缩包存入到文件夹  文件夹命名 年-月-日 再次打包
# 5使用scp拷贝到备份机器
# 6备份机器解压到目录压缩包  通过校验码 校验binlog压缩包是否完整
  # 完整 完成备份 ------发邮件给管理员明确备份成功
  # 不完整 报错 ------- 发邮件给管理员要求手动备份
# 变量
user='root'
passwd=123456

backup() {
# 获取信息
binlog_dir='/var/lib/mysql' 
current_binlog=`mysql -u $user -p$passwd -e "show master status"|egrep "binlog.
[[:digit:]]*"|awk '{print $1}'`

# 刷新binlog
mysql -u $user -p$paaswd -e "flush logs"
# 2、压缩binlog日志
tar czf `date +%F`.binlog.tar.gz $binlog_dir/$current_binlog
# 3、生成校验码
md5sum `date +%F`.binlog.tar.gz > `date +%F`_md5sum.txt

# 4、存入文件夹
if [ ! -d `date +%F` ]
then
    mkdir `date +%F`
fi
mv `date +%F`.binlog.tar.gz `date +%F`
mv `date +%F`_md5sum.txt `date +%F` 

# 打包目录
tar czf `date +%F`.tar.gz  `date +%F`
# 5、拷贝到其它机器,注意提前要做ssh认证
scp `date +%F`.tar.gz root@ip:/opt/backup
if [ $? -ne 0 ];then
    echo "ERROR:scp `date +%F`.tar.gz fail"
    exit 1
fi
}
# 6、校验
ssh root@ip "tar xf /opt/backup/`date +%F`.tar.gz"
ssh root@ip "md5sum -c /opt/backup/`date +%F`/`date +%F`_md5sum.txt"

if [ $? -eq 0 ];then
    echo "success"
else
    echo "fail"
fi

backup
user01-user20随机用户

前提

[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# seq 1 20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# seq -s 1 20
11213141516171819110111112113114115116117118119120
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# seq -s ' ' 1 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# seq -s ' ' -w 1 20
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20

随机6位[a-zA-Z0-9]数
/dev/urandom|strings -6 生成6位数,egrep '^[a-zA-Z0-9]{6}$'过滤[a-zA-Z0-9],head -20取20个

[root@iZbp1d6ukr7d6j6eosyixaZ LianXi]# cat /dev/urandom|strings -6 | egrep '^[a-zA-Z0-9]{6}$'|head  -20
zaY9w2
4EcbpW
fCzNNU
3Jlsj8
QSKU98
5M8bHy
OWGXVw
DOs1pw
ZccYF1
JXr4eA
4hecwa
JhMOo8
D5k4jl
E93IRB
9bB3Pl
jAwl3i
46dXtT
48c9tS
tR83hk
3G4s1W

linux系统创建用户adduser 用户名 设置密码passwd --stdin 用户名或者echo 新密码 | passwd --stdin 用户 删除用户userdel -r 用户名

#! /bin/bash

# 创建user01-user20随机六位数密码 a-zA-Z0-9

#1创建user01-user20
#2生成组随机密码
#3设置密码
#4输出清单

#! /bin/bash

# 创建user01-user20随机六位数密码 a-zA-Z0-9

#1创建user01-user20
#2生成组随机密码
#3设置密码
#4输出清单

adduser(){
pwd_txt=`mktemp pw.XXXXX`   # 生产临时文件

# 1创建用户
for i in `seq -s ' ' -w 1 20`
    do 
        useradd user$i  # 新建用户
done

# 2随机密码
cat /dev/urandom | strings -6 | egrep "^[a-zA-Z0-9]{6}$" | head -n 20 > $pwd_txt

# 3设置密码
for i in `seq -s ' ' -w 1 20`;do
    pw=`head -n $i $pwd_txt | tail -1`  # 取出临时文件的每行数据
    echo $pw | passwd --stdin "user%i" &>/dev/null  # 重置用户名
    echo -e "user$i\t\t$pw"  >> user_add_result.txt   # 将重置后的用户密码导出
done

# 4输出
echo "用户创建成功,密码文件是:user_add_result.txt"
cat user_add_result.txt

# 删除临时文件
rm -fr  $pwd_txt
}
adduser
猜数字

在这里插入图片描述

#! /bin/bash
# Author:AK
# Created Time:
# Release:
# Script Description: 
bulls_and_cows(){
  export COUNT=0
  handle(){
  read -p  "请输入一个1-100的数字:" num
  COUNT=$(($COUNT + 1))
  if [ $num -ge 1 ] &>/dev/null && [ $num -le 100 ];then
    if [ $num -eq 99 ];then
      echo "输入正确,输入了$COUNT"
    else
      if [ $num -gt 99 ];then
        echo "大了,输入了第$COUNT次"
      else
        echo "小了,输入了第$COUNT次"
      fi
      handle
    fi
  else
    handle
  fi
  }
handle
}

bulls_and_cows
9*9乘法表(随笔,非最优)
let i=1
while (($i<=9))
do
   let j=1
   while (($j>=1))&&(($j<=$i));do
      printf $j*$i=$((i*j))"  "    # printf不会换行
      j=$((j+1))
   done
   echo ""
   i=$((i+1))
done
for i in `seq 1 9`;do
    for j in `seq 1 $i`;do
        echo -n -e " $j*$i=$((i*j))\t"
    done
    echo ""
done
监控系统流量
# RX 接收流量 TX发送流量
RX_s=`ifconfig eth0 | grep bytes | sed -n '1p' | awk '{print $5}'`
TX_s=`ifconfig eth0 | grep bytes | sed -n '2p' | awk '{print $5}'`
sleep 5
RX_end=`ifconfig eth0 | grep bytes | sed -n '1p' | awk '{print $5}'`
TX_end=`ifconfig eth0 | grep bytes | sed -n '2p' | awk '{print $5}'`
COUNT_RX=$(($RX_end-$RX_s))
COUNT_TX=$(($TX_end-$TX_s))
# 5秒所有1024*5=50120
RX=$(echo $RX | awk '{print $COUNT_RX/50120 "KB/s"}')
TX=$(echo $TX | awk '{print $COUNT_TX/50120 "KB/s"}')
time3=$(date "+%Y-%m-%d %H:%M:%S")
echo -e "RX:$RX\t\tTX:$TX\t\tTime:$time3" &> /xxxx/nets/mem.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值