千家信息网

shell 案例

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,编写 hello world 脚本#!/bin/bashecho "hello world"通过位置变量创建 Linux 系统账户及密码#!/bin/bash#$1 是执行脚本的第一个参数,$2 是执
千家信息网最后更新 2026年11月03日shell 案例
  1. 编写 hello world 脚本
    #!/bin/bash
    echo "hello world"

  2. 通过位置变量创建 Linux 系统账户及密码
    #!/bin/bash
    #$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数
    useradd "$!"
    echo "$2" | passwd ‐‐stdin "$2"

  3. 每周 5 使用 tar 命令备份/var/log 下的所有日志文件
    #vim /root/logbak.sh
    #编写备份脚本,备份后的文件名包含日期标签,防止后面的备份将前面的备份数据覆盖
    #注意 date 命令需要使用反引号括起来,反引号在键盘键上面
    tar -czf log-date +%Y%m%d.tar.gz /var/log

crontab ‐e #编写计划任务,执行备份脚本

00 03 5 /root/logbak.sh

  1. 一键部署 LNMP(RPM 包版本)
    #!/bin/bash
    #使用 yum 安装部署 LNMP,需要提前配置好 yum 源,否则该脚本会失败
    #本脚本使用于 centos7.2 或 RHEL7.2
    yum ‐y install httpd
    yum ‐y install mariadb mariadb‐devel mariadb‐server
    yum ‐y install php php‐mysql

systemctl start httpd mariadb
systemctl enable httpd mariadb

  1. 实时监控本机内存和硬盘剩余空间,剩余内存小于 500M、根分区剩余空间小于 1000M
    时,发送报警邮件给 root 管理员
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #提取根分区剩余空间
    disk_size=$(df / |awk '/\//{print $4}')

#提取内存剩余空间
mem_size=$(free |awk '/Mem/{print $4}')
while :
do
#注意内存和磁盘提取的空间大小都是以 Kb 为单位
if [ $disk_size ‐le 512000 ‐a $mem_size ‐le 1024000 ];then
mail ‐s Warning root <Insufficient resources,资源不足
EOF
fi
done

  1. 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
    猜小了或猜大了,直至用户猜对脚本结束。
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #RANDOM 为系统自带的系统变量,值为 0‐32767 的随机数
    #使用取余算法将随机数变为 1‐100 的随机数
    num=$[RANDOM0+1]

#使用 read 提示用户猜数字
#使用 if 判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),‐lt(小于),‐le(小
于等于)
while :
do
read ‐p "计算机生成了一个 1‐100 的随机数,你猜: " cai
if [ $cai ‐eq $num ];then
echo "恭喜,猜对了"
exit
elif [ $cai ‐gt $num ];then
echo "Oops,猜大了"
else
echo "Oops,猜小了"
fi
done

  1. 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不
    是,则提示您非管理员(使用字串对比版本)
    #!/bin/bash
    if [ $USER == "root" ];then
    yum ‐y install vsftpd
    else
    echo "您不是管理员,没有权限安装软件"
    fi

  2. 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不
    是,则提示您非管理员(使用 UID 数字对比版本)

#!/bin/bash
if [ $UID ‐eq 0 ];then
yum ‐y install vsftpd
else
echo "您不是管理员,没有权限安装软件"
fi

  1. 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户
    不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默
    认的 123456 作为默认密码。
    #!/bin/bash
    read ‐p "请输入用户名: " user
    #使用‐z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并退出脚本,退出码为 2
    #没有输入用户名脚本退出后,使用$?查看的返回码为 2
    if [ ‐z $user ];then
    echo "您不需输入账户名"
    exit 2
    fi
    #使用 stty ‐echo 关闭 shell 的回显功能
    #使用 stty echo 打开 shell 的回显功能
    stty ‐echo
    read ‐p "请输入密码: " pass
    stty echo
    pass=${pass:‐123456}
    useradd "$user"
    echo "$pass" | passwd ‐‐stdin "$user"

  2. 依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
    #!/bin/bash
    read ‐p "请输入一个整数:" num1
    read ‐p "请输入一个整数:" num2
    read ‐p "请输入一个整数:" num3
    #不管谁大谁小,最后都打印 echo "$num1,$num2,$num3"
    #num1 中永远存最小的值,num2 中永远存中间值,num3 永远存最大值
    #如果输入的不是这样的顺序,则改变数的存储顺序,如:可以将 num1 和 num2 的值对调
    tmp=0
    #如果 num1 大于 num2,就把 num1 和和 num2 的值对调,确保 num1 变量中存的是最小值
    if [ $num1 ‐gt $num2 ];then

    tmp=$num1
    num1=$num2
    num2=$tmp
    fi
    #如果 num1 大于 num3,就把 num1 和 num3 对调,确保 num1 变量中存的是最小值
    if [ $num1 ‐gt $num3 ];then

    tmp=$num1
    num1=$num3
    num3=$tmp
    fi
    #如果 num2 大于 num3,就把 num2 和 num3 对标,确保 num2 变量中存的是小一点的值

if [ $num2 ‐gt $num3 ];then
tmp=$num2
num2=$num3
num3=$tmp
fi

echo "排序后数据为:$num1,$num2,$num3"

  1. 编写脚本,实现人机<石头,剪刀,布>游戏
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    game=(石头 剪刀 布)
    num=$[RANDOM%3]
    computer=${game[$num]}
    #通过随机数获取计算机的出拳
    #出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能

echo "请根据下列提示选择您的出拳手势"
echo "1.石头"
echo "2.剪刀"
echo "3.布"

read ‐p "请选择 1‐3:" person
case $person 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. 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
    状态(for 版本)
    #!/bin/bash
    for i in {1..254}
    do
    ping ‐c2 ‐i0.3 ‐W1 192.168.4.$i &>/dev/null
    if [ $? -eq 0 ];then
    echo "192.168.4.$i is up"
    else
    echo "192.168.4.$i is down"
    fi
    done

  2. 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
    状态(while 版本)
    #!/bin/bash
    i=1
    while [ $i ‐le 254 ]
    do
    ping ‐c2 ‐i0.3 ‐W1 192.168.4.$i &>/dev/null
    if [ $? -eq 0 ];then
    echo "192.168.4.$i is up"
    else
    echo "192.168.4.$i is down"
    fi
    let i++
    done

  3. 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
    状态(多进程版)
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #定义一个函数,ping 某一台主机,并检测主机的存活状态
    myping(){
    ping ‐c2 ‐i0.3 ‐W1 $1 &>/dev/null
    if [ $? ‐eq 0 ];then
    echo "$1 is up"
    else
    echo "$1 is down"
    fi
    }
    for i in {1..254}
    do
    myping 192.168.4.$i &
    done
    #使用&符号,将执行的函数放入后台执行
    #这样做的好处是不需要等待 ping 第一台主机的回应,就可以继续并发 ping 第二台主机,依次类推。

  4. 编写脚本,显示进度条
    #!/bin/bash
    jindu(){
    while :
    do
    echo ‐n '#'
    sleep 0.2
    done
    }
    jindu &
    cp ‐a $1 $2
    killall $!
    echo "拷贝完成''

  5. 进度条,动态时针版本
    #!/bin/bash
    #定义一个显示进度的函数,屏幕快速显示| / ‐ \
    rotate_line(){
    INTERVAL=0.1 #设置间隔时间
    COUNT="0" #设置 4 个形状的编号,默认编号为 0(不代表任何图像)
    while :
    do
    COUNT=expr $COUNT + 1 #执行循环,COUNT 每次循环加 1,(分别代表 4 中不同的形状)
    case $COUNT in #判断 COUNT 的值,值不一样显示的形状就不一样
    "1") #值为 1 显示‐
    echo ‐e '‐'"\b\c"
    sleep $INTERVAL
    ;;
    "2") #值为 2 显示\,第一个\是转义
    echo ‐e '\'"\b\c"
    sleep $INTERVAL
    ;;
    "3") #值为 3 显示|
    echo ‐e "|\b\c"
    sleep $INTERVAL
    ;;
    "4") #值为 4 显示/
    echo ‐e "/\b\c"
    sleep $INTERVAL
    ;;
    *) #值为其他时,将 COUNT 重置为 0
    COUNT="0";;
    esac
    done
    }
    rotate_line

  6. 99 乘法表(编写 shell 脚本,打印 99 乘法表)
    #!/bin/bash

for i in seq 9
do
for j in seq $i
do
echo ‐n "$i$j=$[ij] "
done
echo
done

  1. 使用死循环实时显示 eth0 网卡发送的数据包流量
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    while :
    do
    echo '本地网卡 eth0 流量信息如下: '
    ifconfig eth0 | grep "RX pack" | awk '{print $5}'
    ifconfig eth0 | grep "TX pack" | awk '{print $5}'
    sleep 1
    done

  2. 使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码
    #!/bin/bash
    #本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息
    for i in cat user.txt
    do
    useradd $i
    echo "123456" | passwd ‐‐stdin $i
    done

  3. 编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件
    #!/bin/bash
    #执行脚本时,需要给脚本添加位置参数
    #脚本名 txt doc(可以将 txt 的扩展名修改为 doc)
    #脚本名 doc jpg(可以将 doc 的扩展名修改为 jpg)

for i in "ls .$1"
do
mv $i ${i%.
}.$2
done

脚本 用户 输入 主机 提示 管理员 管理 密码 数字 文件 状态 变量 备份 版本 计算机 随机数 空间 丁丁 剩余 内存 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技企业 广州百单互联网科技有限公司 万易互联网科技有限公司 长亮科技互联网金融 上海卓越科技 互联网 盛创互联网科技有限公司 华脉科技工业互联网产品 央行互联网金融科技公司 浙江互联网科技研学营 互联网科技扶贫时间 996高科技互联网公司 互联网在线教育科技创业 玉溪新华互联网科技好不好 朱啸虎曾投资哪些互联网科技企业 长沙互联网科技 郑州欣桑互联网科技有限公司 宁波跨境商互联网科技有限公司 上海同邻互联网科技有限公司规模 中国科技和美国互联网 张家口科技产业互联网平台 互联网品科技 科技信息互联网 科技互联网公司logo 深圳市优智互联网科技有限公司 开一家科技互联网公司需要多少钱 元气玛特互联网科技公司是外包吗 互联网公司高科技产品 图游互联网科技 科技信息时代互联网发展 互联网高科技绘画
0