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