当前位置:首页>Linux>Linux操作系统-shell编程之4个简单的应用案例

Linux操作系统-shell编程之4个简单的应用案例

  • 2026-10-11 05:35:16
Linux操作系统-shell编程之4个简单的应用案例

       本文提供四个实用的Shell脚本应用案例,包括:批量创建用户、Nginx源码安装、系统巡检以及主机连通性检测。

1、自动批量创建用户

创建100个用户,输出用户名和密码的列表,用户密码需要为随机字符串,用户列表在userlist.txt文件中。

需求实现shell脚本如下:

#!/bin/bash#this script is for adding user#version 1.0#author: albertzhang#user.txt格式如下#user1#user2#user3#....while read line;do    username=$line    #添加用户    useradd $username    #产生随机密码    passwd=`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 10`    #设置用户密码    echo "$passwd" |passwd --stdin $username    #将账户密码输出到userlist.txt文件中   if [ $? -eq 0 ];then       echo "$username$passwd" >> userlist.txt       echo "add $username success."   fidone < user.txt

脚本执行结果验证:


2、Nginx源码自动安装

通过原码编译安装linux,并实现nginx开机自启动。

需求实现shell脚本如下:

#!/bin/bash#this script is for installing nginx by using source code of nginx#version 1.0#author: albertzhang#安装基础软件包yum groupinstall "Development Tools"yum install wget pcre pcre-devel zlib zlib-devel openssl openssl-devel -y#下载nginx源码包并解压wget https://nginx.org/download/nginx-1.30.4.tar.gztar -zxvf nginx-1.30.4.tar.gzcd nginx-1.30.4#创建nginx运行用户groupadd nginxuseradd -g nginx -s /sbin/nologin -M nginx#nginx原码安装配置./configure \    --prefix=/usr/local/nginx \    --user=nginx \    --group=nginx \    --with-http_ssl_module \    --with-http_v2_module \    --with-http_stub_status_module \    --with-stream \    --with-http_gzip_static_module#编译与安装nginxmake && make install#测试nginx是否安装成功/usr/local/nginx/sbin/nginx && echo "nginx 启动成功" || (echo "nginx 启动失败";exit 1)ipaddr=`ifconfig |egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|grep -v '127.0.0.1' |awk -F' ' '{print (curl -o /dev/null -s -w "%{http_code}\n" http://status_code == '200' ]];then     echo "nginx 安装成功"else     echo "nginx 安装失败"	 exit 1fi#添加nginx服务文件,实现开机自启动cat > /etc/systemd/system/nginx.service << EOF[Unit]Description=The NGINX HTTP and reverse proxy serverAfter=network.target[Service]Type=forkingExecStartPre=/usr/local/nginx/sbin/nginx -tExecStart=/usr/local/nginx/sbin/nginxExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s stopPrivateTmp=true[Install]WantedBy=multi-user.targetEOF/usr/local/nginx/sbin/nginx -s stop && systemctl start nginx systemctl enable nginxif systemctl status nginx |grep running;then   echo "nginx 服务启动成功"   echo "nginx 访问地址:http://(hostname)fi

脚本执行结果验证:


3、系统自动巡检

巡检操作系统,获取CPU、内存、磁盘空间使用率、磁盘IO使用率等指标。

需求实现shell脚本如下:

#!/bin/bash# ============================================================# system inspection for centos7# function:usage of cpu、usage of memory、usage of disk capacity、util of disk# author:albertzhang# version:1.0# ============================================================# 设置颜色输出(可选)RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[0;33m'NC='\033[0m' # No Color# 获取主机名和当前时间HOSTNAME=$(hostname)DATETIME=$(date +"%Y-%m-%d %H:%M:%S")# 输出标题echo "============================================================"echo -e "系统巡检报告 - ${HOSTNAME}"echo "时间: ${DATETIME}"echo "============================================================"# ------------------------------------------------------------# 1. CPU 使用率# ------------------------------------------------------------echo -e "\n[1] CPU 使用率"# 使用 top 或 mpstat;这里用 top 的 batch 模式获取CPU_IDLE=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}' | cut -d. -f1)CPU_USAGE=$((100 - CPU_IDLE))echo "  CPU 使用率: ${CPU_USAGE}% (空闲 ${CPU_IDLE}%)"# 系统负载(1分钟、5分钟、15分钟)LOAD=$(uptime | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//')echo "  系统负载: ${LOAD}"# ------------------------------------------------------------# 2. 内存使用率# ------------------------------------------------------------echo -e "\n[2] 内存使用率"MEM_TOTAL=$(free -m | awk '/^Mem:/{print $2}')MEM_USED=$(free -m | awk '/^Mem:/{print $3}')MEM_FREE=$(free -m | awk '/^Mem:/{print $4}')MEM_AVAIL=$(free -m | awk '/^Mem:/{print $7}')MEM_PERCENT=$((MEM_USED * 100 / MEM_TOTAL))echo "  总内存: ${MEM_TOTAL} MB"echo "  已用内存: ${MEM_USED} MB"echo "  空闲内存: ${MEM_FREE} MB"echo "  可用内存: ${MEM_AVAIL} MB"echo "  内存使用率: ${MEM_PERCENT}%"# ------------------------------------------------------------# 3. 磁盘空间使用率(主要分区)# ------------------------------------------------------------echo -e "\n[3] 磁盘空间使用率 (主要分区)"# 显示所有挂载点,排除 tmpfs、devtmpfs 等df -hP | grep -vE '^(Filesystem|tmpfs|devtmpfs)' | while read line; do    usage=$(echo $line | awk '{print $5}' | sed 's/%//')    mount=$(echo $line | awk '{print $6}')    used=$(echo $line | awk '{print $3}')    avail=$(echo $line | awk '{print $4}')    size=$(echo $line | awk '{print $2}')    # 如果使用率超过 80% 则高亮显示    if [ "$usage" -ge 80 ] 2>/dev/null; then        echo -e "  ${RED}${mount}${NC} 总容量 ${size} 已用 ${used} 可用 ${avail} 使用率 ${usage}% (警告)"    else        echo "  ${mount} 总容量 ${size} 已用 ${used} 可用 ${avail} 使用率 ${usage}%"    fidone# ------------------------------------------------------------# 4. 磁盘 I/O 使用率 (%util)# ------------------------------------------------------------echo -e "\n[4] 磁盘 I/O 使用率 (%util)"# 检查 iostat 是否安装if ! command -v iostat &>/dev/null; then    echo -e "  ${YELLOW}警告: iostat 未安装,请执行 'yum install -y sysstat' 安装。${NC}"else    # 仅显示非 0 使用率的设备,或全部显示    iostat -x -k 1 2 | tail -n +4 | while read line; do        # 跳过空行        [ -z "$line" ] && continue        # 提取设备名和 %util(倒数第二列)        device=$(echo $line | awk '{print $1}')        util=$(echo $line | awk '{print $(NF-1)}')        # 跳过 loop 或 ram 设备        if [[ "$device" =~ ^(loop|ram|sr) ]]; then            continue        fi        # 如果 util 是数字且大于 0,或者我们想显示所有        if [[ "$util" =~ ^[0-9.]+$ ]] && [ "$(echo "$util > 0" | bc)" -eq 1 ] 2>/dev/null; then            echo "  ${device}: %util = ${util}%"        fi    donefiecho -e "\n============================================================"echo "巡检完成"echo "============================================================"


4、主机连通性自动检测

编写shell 脚本检测主机列表内的主机存活与否。

需求实现shell脚本如下:

#!/bin/bash#check host is up or down#version 1.0#author: albertzhang#第一种方法#for host in `cat iplist.txt`;do#    ping -c 2 -w 1 $host >/dev/null 2>&1 && echo "$host is up." || echo "$host is down."#done#第二种方法cat iplist.txt | while read host;do                     ping -c 2 -w 1 $host >/dev/null 2>&1 && echo"$host is up." || echo"$host is down."                     done


Shell脚本相关文章到此就结束了,以上也只是展示了用shell脚本实现一些简单的功能,熟悉了shell之后,可以使用shell脚本结合现场的环境实现更多的复杂功能,将其应用到实际的运维工作中,作为提升工作效率的一大利器。熟悉shell的方法就是多写多练,无他唯手熟尔。如果你有任何疑问,欢迎您留言交流!

最新文章

随机文章