一些shell脚本

本文介绍了多个实用的Shell脚本案例,包括石头剪刀布游戏、局域网主机状态检查、进度条显示、批量文件名修改、一键部署LNMP套件、特定时段服务请求统计、Nginx服务管理脚本以及文件修改检测。这些脚本涵盖了基本的Shell编程技巧和系统管理任务,对于提升Shell脚本编写能力很有帮助。
摘要由CSDN通过智能技术生成

1、脚本1 人机<石头,剪刀,布>游戏

case value in
value1)
    command1
    command2
    ...
    commandN
    ;;
value2)
    command1
    command2
    ...
    commandN
    ;;
*)
   xxxx
esac

输入的value对应为它设置对应的执行命令区域(;;表示区域命令执行完毕),没有该value,使用星号 * 捕获该值,再执行后面的命令。在 * 中不需要;;结尾

  • 【 -eq】 == equal
  • 【 -nq】 == not equal
#!/bin/bash

game=(石头 剪刀 布)
num=$[RANDOM%3]
robot=${game[$num]}
# 首先自定义出“机器人”所使用的的手势,使用随机函数创建一个随机数跟3取余 \
# 出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能(石头 剪刀 布)
 
echo "请选择出拳手势"
echo "1.石头"
echo "2.剪刀"
echo "3.布"
 
read -p "请选择 1‐3:" gesture   ##read需要在屏幕输入数据 并保存在gesture这个变量中
case  $gesture  in
1)##你选择了出石头
  if [ $num -eq 0 ]##假如机器人除了石头
  then
    echo "平局"
    elif [ $num -eq 1 ]##假如机器人出了剪刀
    then
      echo "你赢"
  else##假如机器人出了布
    echo "机器人赢"
  fi;;
2)   
  if [ $num -eq 0 ]
  then
    echo "机器人赢"
    elif [ $num -eq 1 ]
    then
      echo "平局"
  else
    echo "你赢"
  fi;;
3)
  if [ $num -eq 0 ]
  then
    echo "你赢"
    elif [ $num -eq 1 ]
    then
      echo "机器人赢"
  else
    echo "平局"
  fi;;
*) ##输入了其他数值
  echo "必须输入 1‐3 的数字"
esac##结束

脚本1是一个较为简单的case语法和逻辑。


2、 局域网内主机开启情况

for循环 for value in {xx }
echo &> /dev/null 将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃

编写脚本测试 局域网中192.168.0.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机

for i in {1..254}
do
  # 每隔0.5秒ping一次,一共ping2次,并以1毫秒为单位设置ping的超时时间
     ping ‐c 2 ‐i 0.5 ‐W 1 192.168.0.$i  &>/dev/null
    if  [ $? -eq 0 ];then
         echo "192.168.0.$i is up"
     else
         echo  "192.168.0.$i is down"
     fi
done

可以使用函数,将每一次的函数后台(&)运行,不必等到主机响应动作完成再进行下一次的探测

pingalive(){
ping ‐c 2 ‐i 0.3 ‐W 1 $1  &>/dev/null
if  [ $? -eq 0 ];then
  echo "$1 is up"
else
  echo "$1 is down"
fi
}
for i in {1..254}
do
     pingalive 192.168.4.$i &
done

3、 进度条

#!/bin/bash

do_main() {
        #运行的主程序  在这里放入将要运行的程序
        sleep 20
}

progress() {
        #设置初始参数
        local main_pid=$1
        local length=20
        local ratio=1
        while [ "$(ps -p ${main_pid} | wc -l)" -ne "1" ] ; do  #验证程序是否还在运行
                mark='>'    ##覆盖图标
                progress_bar=
                for i in $(seq 1 "${length}"); do    ##创建初始进度条
                        if [ "$i" -gt "${ratio}" ] ; then
                                mark='-'
                        fi
                        progress_bar="${progress_bar}${mark}"
                done
                printf "Progress: ${progress_bar}\r"  
                ratio=$((ratio+1))
                if [ "${ratio}" -gt "${length}" ] ; then
                        ratio=1     ##一次覆盖完成,ratio回复
                fi
                sleep 0.5
        done
}

do_main & do_main_pid=$(jobs -p | tail -1) #获取pid

progress "${do_main_pid}" & progress_pid=$(jobs -p | tail -1)  #将pid放入progress函数

wait "${do_main_pid}"    #等待进程完成

printf "Progress: done                \n"

实现的效果还只是表面的,并不能实时的展现内部程序运行的结果
更多是一个方法论,怎么去用>覆盖原先的-

4、 批量修改文件名

编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件

#!/bin/bash

# 设置两个参数表示在当前目录想修改的后缀以及修改后的后缀
#判断是否输入了两个参数,没有输出两个则退出脚本
if [ $# -eq 2 ];
then
    echo "$1 $2 已经传入脚本"
else
	echo "错误"
fi
 
for i in `ls *.$1`
do
     mv $i ${i%.*}.$2
done

5、 一键部署LNMP

多代码的脚本还是要多用函数有小问题需要修改时方便找出

#!/bin/bash

# 一键部署 LNMP(源码安装版本)
menu()
{
clear
echo "  ##############‐‐‐‐Menu‐‐‐‐##############"
echo "# 1. Install Nginx"
echo "# 2. Install MySQL"
echo "# 3. Install PHP"
echo "# 4. Exit Program"
echo "  ########################################"
}
 
choice()
{
  read -p "Please choice a menu[1‐4]:" select
}
 
install_nginx()
{
  id nginx &>/dev/null
  if [ $? -ne 0 ];then
    useradd -s /sbin/nologin nginx
  fi
  if [ -f nginx‐1.8.0.tar.gz ];then
    tar -xf nginx‐1.8.0.tar.gz
    cd nginx‐1.8.0
    yum -y install  gcc pcre‐devel openssl‐devel zlib‐devel make
    ./configure ‐‐prefix=/usr/local/nginx ‐‐with‐http_ssl_module
    make
    make install
    ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
    cd ..
  else
    echo "没有 Nginx 源码包"
  fi
}
 
install_mysql()
{
  yum -y install gcc gcc‐c++ cmake ncurses‐devel perl
  id mysql &>/dev/null
  if [ $? -ne 0 ];then
    useradd -s /sbin/nologin mysql
  fi
  if [ -f mysql‐5.6.25.tar.gz ];then
    tar -xf mysql‐5.6.25.tar.gz
    cd mysql‐5.6.25
    cmake .
    make
    make install
    /usr/local/mysql/scripts/mysql_install_db ‐‐user=mysql ‐‐datadir=/usr/local/mysql/data/
‐‐basedir=/usr/local/mysql/
    chown -R root.mysql /usr/local/mysql
    chown -R mysql /usr/local/mysql/data
    /bin/cp -f /usr/local/mysql/support‐files/mysql.server /etc/init.d/mysqld
    chmod +x /etc/init.d/mysqld
    /bin/cp -f /usr/local/mysql/support‐files/my‐default.cnf /etc/my.cnf
    echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
    ldconfig
    echo 'PATH=\$PATH:/usr/local/mysql/bin/' >> /etc/profile
    export PATH
  else
    echo  "没有 mysql 源码包"
    exit
  fi
}
 
install_php()
{
#安装 php 时没有指定启动哪些模块功能,如果的用户可以根据实际情况自行添加额外功能如‐‐with‐gd 等
yum  -y  install  gcc  libxml2‐devel
if [ -f mhash‐0.9.9.9.tar.gz ];then
  tar -xf mhash‐0.9.9.9.tar.gz
  cd mhash‐0.9.9.9
  ./configure
  make
  make install
  cd ..
if [ ! ‐f /usr/lib/libmhash.so ];then
  ln -s /usr/local/lib/libmhash.so /usr/lib/
fi
ldconfig
else
  echo "没有 mhash 源码包文件"
  exit
fi
if [ -f libmcrypt‐2.5.8.tar.gz ];then
  tar -xf libmcrypt‐2.5.8.tar.gz
  cd libmcrypt‐2.5.8
  ./configure
  make
  make install
  cd ..
  if [ ! -f /usr/lib/libmcrypt.so ];then  
    ln -s /usr/local/lib/libmcrypt.so /usr/lib/
  fi
  ldconfig
else
  echo "没有 libmcrypt 源码包文件"
  exit
fi
if [ -f php‐5.4.24.tar.gz ];then
  tar -xf php‐5.4.24.tar.gz
  cd php‐5.4.24
  ./configure  ‐‐prefix=/usr/local/php5  ‐‐with‐mysql=/usr/local/mysql  ‐‐enable‐fpm    ‐‐
  enable‐mbstring  ‐‐with‐mcrypt  ‐‐with‐mhash  ‐‐with‐config‐file‐path=/usr/local/php5/etc  ‐‐with‐
  mysqli=/usr/local/mysql/bin/mysql_config
  make && make install
  /bin/cp -f php.ini‐production /usr/local/php5/etc/php.ini
  /bin/cp -f /usr/local/php5/etc/php‐fpm.conf.default /usr/local/php5/etc/php‐fpm.conf
  cd ..
else
  echo "没有 php 源码包文件"
  exit
fi 
}
 
while :
do
  menu
  choice
  case $select in
  1)
    install_nginx
    ;;
  2)
    install_mysql
    ;;
  3)
    install_php
    ;;
  4)
    exit
    ;;
  *)
    echo error number! #输出非菜单值,退出
  esac
done

6、 查看某个时间段的服务请求和IP地址

条件判断
按照新的分离条件(/:)在文档中的$7“:“$8是时间点,而同时也可以用来与时间单位做比较

# 最后使用 wc ‐l 统计这样的数据有多少行,即多少个
num=$(awk -F "[ /:]" '$7":"$8>="09:00" && $7":"$8<="18:00"' /var/log/httpd/access_log |wc -l)
echo  "xx时间段有 $num 条请求"
awk -F "[ /:]" '$7":"$8>="09:00" && $7":"$8<="18:00"{print 有 $1 这个ip访问过}' /var/log/httpd/access_log

7、 nginx启停脚本

脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本
本脚本名为/etc/init.d/nginx,则 service nginx start 就可以启动该服务

#!/bin/bash
#设置好nginx的相关目录 
program=/usr/local/nginx/sbin/nginx
npid=/usr/local/nginx/logs/nginx.pid
start(){
if [ -f $npid ];then     #-f是否有这个文件
  echo  "nginx 已经处于开启状态"
else
  $program  #开启nginx服务
fi
stop(){
if [ -! -f $npid ];then   #开启之后在指定文件夹存在pid文件
  echo "nginx 服务已经关闭"
else
  $program -s stop
  echo "关闭服务 ok"
fi
}
status(){
if [ -f $pid ];then
  echo "服务正在运行..."
else
  echo "服务已经关闭"
fi
}
 
case $1 in
start)
  start;;
stop)
  stop;;
restart)
  stop
  sleep 1
  start;;
status)
  status;;
*)
  echo  "$0 {usage|arg}"
esac

8、 检测文件是否被修改过

使用md5对文件的数据进行加密得出唯一hash值,在有人改动过之后再次进行md5计算会产生不一样的值,
通过这种方式检测文件是否被修改过

#!/bin/bash
 
# 本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文件
for i in $(ls /etc/*.conf)
do
  md5sum "$i" >> /var/log/conf_file.log
done
if [$(cat /var/log/conf_file.log)|wc -l -gt 2 ];then
num1=$(sed 1p /var/log/conf_file.log )
num2=$(tail -n 1 /var/log/conf_file.log)
if [num1 -eq];then
	echo "文件没有被修改过"
else
	echo "文件被修改过"
fi
else
	echo "你第一次启动该脚本"
fi		
for i in $(awk {print $1})    


**9、**随机输出8位长的密码

通过先列举出所有常用字符,再通过random函数循环随机输出字符并存储
$#统计密码库的长度 给到random取值
KaTeX parse error: Expected '}', got 'EOF' at end of input: {key:index:1} 在index步长中抽取字符

#!/bin/bash

key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
num=${#key}
pass=''
# 每次都是随机数对密码库的长度取余,确保提取的密码字符不超过密码库的长度
# 每次循环提取一位随机密码,并将该随机密码追加到 pass 变量的最后
for i in {1..8}
do  
  index=$[RANDOM%num]
  password=$password${key:$index:1}
done
echo $password

或者使用tr函数给出想要字符类型,让函数随机输出

tr -dc '_A‐Za‐z0‐9' </dev/urandom | head -c 10

**10、**打包备份数据

&&是前一个命令执行成功了才会执行后一条命令
-z 查看是否为空

#!/bin/bash
# 制定目录路径,脚本自动将该目录使用 tar 命令打包备份到/data目录 
 
[ ! -d /data ] && mkdir /data  
[ -z $1 ] && exit  ##为空则退出
if [ -d $1 ];then
  tar -czf /data/$1.-`date +%Y%m%d`.tar.gz $1
else
    echo "该目录不存在"
    exit 107
fi
echo "备份完成"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值