shell 基础强化笔记

本贴最后更新于 1971 天前,其中的信息可能已经时异事殊

1. 循环相关

1.1. 单条件循环

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

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

1.2. 整数判断

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

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

#!/bin/bash if [ $# -ne 1 ];then echo "please input at least one param!" exit fi systemctl status "$1" &>/dev/null rc=$? if [ $rc -eq 0 ];then echo "$1 is running!" elif [ $rc -eq 4 ];then echo "$1 is not install!" else echo "$1 is not runing!" fi

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

1.4. 多整数判断比较

[ 1 -lt 2 -a 5 -gt 10 ];$? >> 1 [ 1 -lt 2 -o 5 -gt 10 ];$? >> 0 [[ 1 -lt 2 && 5 -gt 10 ]];$? >> 1 [[ 1 -lt 2 || 5 -gt 10]];$? >> 0

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

1.5. 正则匹配判断

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

#!/bin/bash # 获取学生输入成绩 read -p "输入你的考试成绩:" grade [[ "$grade" =~ ^[0-9]+$ ]] if [ $? -ne 0 ];then echo "请好好输入!" exit fi # 判断学生成绩在哪一个等级范围 if [ $grade -lt 60 ];then echo “滚去补考!” elif [ $grade -ge 60 -a $grade -lt 80 ];then echo "你的考试成绩合格" elif [ $grade -ge 80 -a $grade -le 100 ];then echo "你真棒👍" else echo "瘪犊子,好好输入你的成绩" fi

1.6. 作业实战

1.6.1. 日志清理

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

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

​ 2.判断文件是否存在

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

#!/bin/bash logfile_path="/var/log/messages" if [ $UID -eq 0 ];then if [ -f "$logfile_path" ];then tail -n 100 $logfile_path > $logfile_path.bak cat $logfile_path.bak > $logfile_path rm -rf $logfile_path.bak echo "删除成功并保留最近一百行" echo `cat $logfile_path` else echo "日志文件不存在" fi else echo "请使用root用户操作!" fi

1.6.2. 判断某进程运行

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

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

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

1.6.3. 获取服务器所有用户

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

1.6.4 备份所有的数据库

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

1.拿到所有的数据库

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

mysql -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 循环去做比较好

#!/bin/bash cat <<eof ********************** ** 你好 ** ** 我好 ** ** 大家好 ** ********************** eof

2. case 循环

2.1 rsync 启停脚本

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

2.如何停止 pkill rsync

3.脚本名称 rsync_daemon

#!/bin/bash source /etc/init.d/functions rs=$1 case $rs in start) if [ ! -f /var/run/rsync.pid ];then touch /var/run/rsync.pid rsync --daemon action "Rsync starting ......" /bin/true else action "Service Rsync Runing ......" /bin/false fi ;; stop) if [ -f /var/run/rsync.pid ];then rm -f /var/run/rsync.pid pkill rsync action "Rsync stoping ......" /bin/true else action "Service Rsync Stoping ......" /bin/false fi ;; restart) if [ -f /var/run/rsync.pid ];then rm -f /var/run/rsync.pid pkill rsync action "Rsync stoping ......" /bin/true else action "Service Rsync Stoping ......" /bin/false fi if [ ! -f /var/run/rsync.pid ];then touch /var/run/rsync.pid rsync --daemon action "Rsync starting ......" /bin/true else action "Service Rsync Runing ......" /bin/false fi ;; status) status=`ps -ef |grep rsync|grep -v pts |grep -v grep |awk '{print $2}'` if [ ! -z "$status" ];then echo "Rsync is active [$status]" else echo "Rsync is inactive" fi ;; *) echo "USAGE: $0 {start|stop|restart|status}" exit esac

rsync 启停脚本

2.2 nginx 启停脚本

#!/bin/bash source /etc/init.d/functions #加锁 if [ -f /tmp/nginx.lock ];then echo "此程序正在运行" fi touch /tmp/nginx.lock rs=$1 case $rs in start) if [ ! -f /var/run/nginx.pid ];then touch /var/run/nginx.pid /usr/sbin/nginx action "nginx starting ......" /bin/true else action "Service nginx Runing ......" /bin/false fi ;; stop) if [ -f /var/run/nginx.pid ];then /usr/sbin/nginx -s stop action "nginx stoping ......" /bin/true else action "Service nginx Stoping ......" /bin/false fi ;; restart) /usr/sbin/nginx -s reload action "nginx restart ......" /bin/true ;; status) status=`ps -ef |grep nginx|grep -v pts |grep -v grep |awk '{print $2}'` if [ ! -z "$status" ];then echo "nginx is active [$status]" else echo "nginx is inactive" fi ;; *) echo "USAGE: $0 {start|stop|restart|status}" exit esac #解锁 rm -f /tmp/nginx.lock

2.3 实现系统管理箱

#!/bin/bash cat << eof =========================== h. 显示系统帮助 f. 显示磁盘分区 d. 显示磁盘挂载 m. 查看内存使用 u. 查看系统负载 q. 退出此工具箱 =========================== eof while true do read -p "输入你需要的操作: " sys case $sys in h) ;; f) df -h ;; d) mount -a|less ;; m) free -m ;; u) w ;; q) exit ;; *) echo "USAGE: $0 [ h | f | d | m | u | q]" esac done
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    124 引用 • 74 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...