shell 基础强化笔记

  |   0 评论   |   0 浏览

1. 循环相关

1.1. 单条件循环

  判断文件或目录是否存在,使用-e 就够了,例如:

1if [ -e /etc/hosts ];then echo "纯在"; fi
  • -d 判断目录
  • -e 判断文件或目录
  • -f 判断文件
  • -r 判断可读
  • -w 判断可写
  • -x 判断可执行

1.2. 整数判断

  • -ne 判断不相等
  • -eq 判断相等
  • -gt 判断大于
  • -lt 判断小于
  • -ge 判断大于等于
  • -le 判断小于等于

1.3. 判断程序服务是否正在运行

 1#!/bin/bash
 2if [ $# -ne 1 ];then
 3	echo "please input at least one param!"
 4	exit
 5fi
 6systemctl status "$1" &>/dev/null
 7rc=$?
 8if [ $rc -eq 0 ];then
 9	echo "$1 is running!"
10elif [ $rc -eq 4 ];then
11	echo "$1 is not install!"
12else
13	echo "$1 is not runing!"
14fi

  这里需要说明的一个地方就是,4 表示未安装服务,127 表示没有那个命令

1.4. 多整数判断比较

1[ 1 -lt 2 -a 5 -gt 10 ];$?
2>> 1
3[ 1 -lt 2 -o 5 -gt 10 ];$?
4>> 0
5[[ 1 -lt 2 && 5 -gt 10 ]];$?
6>> 1
7[[ 1 -lt 2 || 5 -gt 10]];$?
8>> 0

  这边需要留意的一个问题就是,如果你用 && 符号那么你一定要是用双中括号,反之亦然

1.5. 正则匹配判断

  [[ "$grade" =~ ^[0-9]+$ ]] + 号表示匹配多个

 1#!/bin/bash
 2
 3# 获取学生输入成绩
 4read -p "输入你的考试成绩:" grade
 5[[ "$grade" =~ ^[0-9]+$ ]]
 6if [ $? -ne 0 ];then
 7	echo "请好好输入!"
 8	exit
 9fi
10# 判断学生成绩在哪一个等级范围
11
12if [ $grade -lt 60 ];then
13	echo “滚去补考!”
14elif [ $grade -ge 60 -a $grade -lt 80 ];then
15	echo "你的考试成绩合格"
16elif [ $grade -ge 80 -a $grade -le 100 ];then
17	echo "你真棒👍"
18else
19	echo "瘪犊子,好好输入你的成绩"
20fi

1.6. 作业实战

1.6.1. 日志清理

  使用 root 用户清理/var/log/messages,并且保留 100 行最新日志

提示:1.先判断当前用户是否为 root

​ 2.判断文件是否存在

​ 3.清空并保留最新 100 行

 1#!/bin/bash
 2
 3logfile_path="/var/log/messages"
 4if [ $UID -eq 0 ];then
 5	if [ -f "$logfile_path" ];then
 6        	tail -n 100 $logfile_path > $logfile_path.bak
 7		cat $logfile_path.bak > $logfile_path
 8		rm -rf $logfile_path.bak
 9		echo "删除成功并保留最近一百行"
10		echo `cat $logfile_path`
11	else
12        	echo "日志文件不存在"
13	fi
14else
15	echo "请使用root用户操作!"
16fi

1.6.2. 判断某进程运行

1systemctl status docker |awk '/^.*Active:/ {print $2}'

awk 后面接着是'',单引号里面是模式 + 空格 +{print $xxx}

我理解的模式就是正则匹配公式,然后可以不写

1.6.3. 获取服务器所有用户

1cat /etc/passwd |awk -F: '{print $1}'

1.6.4 备份所有的数据库

  ​ 每个库一个。sql 文件,记得排出没用的

1.拿到所有的数据库

2.一个一个的备份的数据库

1mysql -u root -pxxx -h163.254.0.221 -e 'show databases'|sed 1d |grep -Ev "sys|mysql|*._schema"|sed -r 's#(.*)# mysqldump -u root -pxxx -h163.254.0.221 -B \1 > \1.sql #g'|bash

  这个 shell 简直了,当然正常的备份还是 for 循环去做比较好

1#!/bin/bash
2
3cat <<eof
4**********************
5**       你好       **
6**       我好       **
7**      大家好      **
8**********************
9eof

2. case 循环

2.1 rsync 启停脚本

1.如何启动命令 rsync --daemon

2.如何停止 pkill rsync

3.脚本名称 rsync_daemon

 1#!/bin/bash
 2source /etc/init.d/functions
 3rs=$1
 4case $rs in
 5	start)
 6		if [ ! -f /var/run/rsync.pid ];then
 7			touch /var/run/rsync.pid
 8			rsync --daemon
 9			action "Rsync starting ......" /bin/true
10		else
11			action "Service Rsync Runing ......" /bin/false
12		fi
13		;;
14	stop)
15		if [ -f /var/run/rsync.pid ];then
16                        rm -f /var/run/rsync.pid
17                        pkill  rsync
18                        action "Rsync stoping ......" /bin/true
19                else
20                        action "Service Rsync Stoping ......" /bin/false
21                fi
22		;;
23	restart)
24		if [ -f /var/run/rsync.pid ];then
25                        rm -f /var/run/rsync.pid
26                        pkill  rsync
27                        action "Rsync stoping ......" /bin/true
28                else
29                        action "Service Rsync Stoping ......" /bin/false
30                fi
31		if [ ! -f /var/run/rsync.pid ];then
32                        touch /var/run/rsync.pid
33                        rsync --daemon
34                        action "Rsync starting ......" /bin/true
35                else
36                        action "Service Rsync Runing ......" /bin/false
37                fi
38		;;
39	status)
40		status=`ps -ef |grep rsync|grep -v pts |grep -v grep |awk '{print $2}'`
41		if [ ! -z "$status" ];then
42			echo "Rsync is active [$status]"
43		else
44			echo "Rsync is inactive"
45		fi
46		;;
47	*)
48		echo "USAGE: $0 {start|stop|restart|status}"
49		exit
50esac

  rsync 启停脚本

2.2 nginx 启停脚本

 1#!/bin/bash
 2source /etc/init.d/functions
 3#加锁
 4if [ -f /tmp/nginx.lock ];then
 5	echo "此程序正在运行"
 6fi
 7touch /tmp/nginx.lock
 8
 9rs=$1
10case $rs in
11	start)
12		if [ ! -f /var/run/nginx.pid ];then
13			touch /var/run/nginx.pid
14			/usr/sbin/nginx
15			action "nginx starting ......" /bin/true
16		else
17			action "Service nginx Runing ......" /bin/false
18		fi
19		;;
20	stop)
21		if [ -f /var/run/nginx.pid ];then
22                        /usr/sbin/nginx -s stop
23                        action "nginx stoping ......" /bin/true
24                else
25                        action "Service nginx Stoping ......" /bin/false
26                fi
27		;;
28	restart)
29		/usr/sbin/nginx -s reload
30		 action "nginx restart ......" /bin/true
31		;;
32	status)
33		status=`ps -ef |grep nginx|grep -v pts |grep -v grep |awk '{print $2}'`
34		if [ ! -z "$status" ];then
35			echo "nginx is active [$status]"
36		else
37			echo "nginx is inactive"
38		fi
39		;;
40	*)
41		echo "USAGE: $0 {start|stop|restart|status}"
42		exit
43esac
44#解锁
45rm -f /tmp/nginx.lock

2.3 实现系统管理箱

 1#!/bin/bash
 2
 3cat << eof
 4	===========================
 5	h. 显示系统帮助
 6	f. 显示磁盘分区
 7	d. 显示磁盘挂载
 8	m. 查看内存使用
 9	u. 查看系统负载
10	q. 退出此工具箱
11	===========================
12eof
13while true
14do
15read -p "输入你需要的操作: " sys
16case $sys in
17	h)
18		;;
19	f)
20		df -h
21		;;
22	d)
23		mount -a|less
24		;;
25	m)
26		free -m
27		;;
28	u)
29		w
30		;;
31	q)
32		exit
33		;;
34	*)
35		echo "USAGE: $0 [ h | f | d | m | u | q]"
36esac
37done
---------------------------------------------------------------
>> 博客地址:https://blog.mufengs.com
>> 邮箱地址:[email protected]
>> 微信帐号:Do8080
>> Github : https://github.com/mufengcoding
---------------------------------------------------------------