case语句

#/bin/sh

case $1 in
    1)
        echo 1
        ;;
    2)
        echo 2
        ;;
    a)
        echo a
        ;;
    *)
        echo 'i do not know'
esac
  • $1可以换为其他变量,case语句判断传入变量的值是否与其中的某个选项匹配,然后执行该选项的代码块,如果都不匹配执行最后的一个代码块
  • 每个选项最后以;;分隔,最后一个选项以esac结束,表示case语句结束

案例1:批量删除用户

  1. 删除用户的前缀read -p "please input prefix: "pre
  2. 删除用户的数量read -p "用户数量": num
  • for i in {1..10};do useradd home$i;done使用命令创建10个用户,用来执行删除操作
  • 通过case语句分支来执行不同的代码块,id命令判断是否存在该用户,执行后面的操作
#/bin/sh

read -p "please input prefix: " pre
read -p "用户数量": num

for i in `seq $num`
do
    echo $pre$i
done

read -p "确定删除[y|Y|yes|n|N|no]": c

case $c in
    y|Y|yes)
        for j in `seq $num`
        do
            id $pre$j > /dev/null 2>&1
            [ $? -eq 0 ] && userdel -r $pre$j
            [ $? -eq 0 ] && echo '删除成功' || echo '删除失败'
        done
    ;;
    n|N|no)
        echo '那就不删除了吧'
esac

案例2:要求使用菜单显示系统的资源使用情况(内存,磁盘,负载,登录用户,ip地址,linux版本)

#/bin/sh

menu(){
cat<<EOF
    1.help帮助
    2.显示内存使用
    3.显示磁盘使用
    4.显示系统负载
    5.显示登陆用户
    6.查看IP地址
    7.查看Linux-version
    8.退出
EOF
}
#显示菜单
menu
while true
do
    read -p '请选择: ' c
    case $c in
        1 )
            menu
            ;;
        2 )
            free -h
            ;;
        3 )
            df -h
            ;;
        4 )
            uptime
            ;;
        5 )
            w
            ;;
        6 )
            hostname -I
            ;;
        7 )
            cat /etc/redhat-release
            ;;
        8 )
            exit
            ;;
        * )
    esac
done

案例3:Nginx启动脚本

  • 通过脚本控制Nginx,并结合case语句
  • /usr/sbin/nginx : 启动
  • /usr/sbin/nginx -s stop : 停止
  • /usr/sbin/nginx -s reload : 重新加载
#/bin/sh

[ -f /etc/init.d/functions ] && . /etc/init.d/functions

test()
{
    if [ $? -eq 0 ];then
        action "nginx $1 is" /bin/true
    else
        action "nginx $1 is" /bin/false
    fi
}


case $1 in
    start )
        /usr/sbin/nginx > /dev/null 2>&1
        test
        ;;
    stop )
        /usr/sbin/nginx -s stop > /dev/null 2>&1
        test
        ;;
    restart )
        /usr/sbin/nginx -s stop > /dev/null 2>&1
        sleep 1 > /dev/null 2>&1
        /usr/sbin/nginx > /dev/null 2>&1
        test
        ;;
    reload )
        /usr/sbin/nginx -s reload > /dev/null 2>&1
        test
        ;;
    status )
        netstat -luntp|grep nginx
        ;;
    * )
        echo $0 '[start|stop|restart|reload|status]'
esac

案例4:jumpserver案例

  1. 脚本免秘钥连接目标服务器
  2. 使用case语句连接不同的目标服务器
  3. 加入一些其他手段防止脚本退出
  • 可以将该脚本加入到开机启动脚本/etc/rc.d/rc.local
  • 将秘钥放到目标服务器点我
#/bin/sh

menu()
{
cat<<EOF
    1.web01 10.0.0.7
    2.web02 10.0.0.8
    3.web03 10.0.0.9
    4.显示菜单
EOF
}
menu
#禁用 ctrl+c 退出脚本
trap "echo 再乱按试试看" INT TSTP HUP
while true; do
    read -p '请选择: ' c
    case $c in
    1 )
        #如果实现免秘钥连接目标服务器需要先将秘钥放到目标服务器中
        echo 'ssh 10.0.0.7'
        ;;
    2 )
        echo 'ssh 10.0.0.8'
        ;;
    3 )
        echo 'ssh 10.0.0.9'
        ;;
    4 )
        menu
        ;;
    #预留退出脚本的后面
    houmen )
        exit
        ;;
    * )
        echo '无效的输入'
esac
done

while循环和控制语句

如果while循环条件为真,就执行循环体内的代码

while [条件表达式]
do
    #循环体
done

从第一行开始读取文件的每一行,每读取一行就循环一次,变量的值为该行的内容,done后面输入读取的文件

while read line
do
    #循环体
done<test.txt

案例:使用while循环读取文本创建用户名和密码

  • 文本内容
#user.txt
zhangsan 123456
lisi 654321
wangwu 112233
  • 脚本内容
#/bin/sh

while read line
do
    user=`echo $line|awk '{print $1}'`
    pass=`echo $line|awk '{print $2}'`
    useradd $user;echo $pass|passwd --stdin $user
done<user.txt

控制语句

  • exit : 结束程序
  • break : 退出当前循环
  • continue : 立即结束当次循环,进行下次循环