Linux Shell 006-流程控制语句

发布时间:2023年12月25日

Linux Shell 006-流程控制语句

本节关键字:Linux、Bash Shell、流程控制语句、case语句
相关指令:if、if…else、if…elif…else、case、read、ping、yum、uname、

if语句语法结构

if结构(F表示false T表示true)
if [ confition ];then
    command
    command
fi

if test 条件;then
    命令
fi

if [[ confition ]];then
    command
    command
fi
if…else结构
if [ condition ];then
    command1
else
    command2
fi

[ 条件 ] && command1 || command2
if…elif…else结构
if [ condition1 ];then
    command1
elif [ condition2 ];then
    command2
else
    command3
fi
层层嵌套结构
if [ condition ];then
    command1
    if [ condition2 ];tnen
        conmmand2
    fi
    else
        if [ condition3 ];then
            command3
        elif [ condition4 ];then
            command4
        else
            command5
        fi
fi
if…else应用示例

题目:让用户自己输入字符串,如果用户输入的是hello,请打印world,否则打印“请输入hello”

#!/bin/env bash

read -p '请输入一个字符串:' str
if [ "$str" = 'hello' ];then
    echo 'world'
 else
    echo '请输入hello!'
fi

case语句

case语句语法结构

说明:pattern表示需要匹配的模式,esac表示case语句结束

case var in        # 定义变量;var代表是变量名
pattern 1)         # 模式1;用 | 分割多个模式,相当于or
    command1       # 需要执行的语句
    ;;             # 两个分号代表命令结束
pattern 2)
    command2
    ;;
pattern 3)
    command3
    ;;
   *)              # default,不满足以上模式,默认执行*)下面的语句
    command4
    ;;
esac

应用案例

判断两天主机是否ping通
#!/bin/env bash
#该脚本用于判断当前主机是否和远程主机互通
#交互式定义一个变量,让用户自己决定去ping哪个主机
read -p "请输入要ping的主机IP:" ip

#使用ping程序判断主机是否互通
ping -c1 $ip &> /dev/null
if [ $? -eq 0 ];then
    echo "当前主机和远程主机$ip是互通的"
else
    echo "挡墙主机和远程主机$ip是不通的"
fi
判断一个进程是否存在
#!/bin/env bash
#该脚本用于判断指定进程(httpd)是否存在
pgrep httpd &> /dev/null
if [ $? -ne 0 ];then
    echo "当前httpd进程不存在"
else
    echo "当前httpd进程存在"
fi

# 或者
test $? -eq 0 && echo "进程存在" || echo "进程不存在"

命令补充

pgrep:以名称为依据从运行进程队列中查找进程,并显示查找到的进程id

常用选项

选项说明
-o仅显示找到的最小(起始)进程号
-n仅显示找到的最大(结束)进程号
-l显示进程名称
-p指定父进程号;pgrep -p 4764 查看父进程下的子进程id
-g指定进程组
-t指定开启进程的终端
-u指定进程的有效用户ID
判断门户网站是否能够正常访问

思路:
(1)可以判断进程是否存在,用/etc/init.d/httpd status判断状态等方法
(2)最好的方法就是直接去访问一下,通过访问成功和失败的返回值判断,Linux环境,wget curl elinks -dump

#!/bin/env bash
# 判断门户网站是否能够正常访问
web_server=10.1.1.2     或者 www.itcast.cn
wget -P /shell/ $web_server &. /etc/null
[ $? -eq 0 ] && echo "网站服务ok" && rm -f /shell/index.* || echo "网站服务错误"
输入一个用户,用脚本判断该用户是否存在
#!/bin/env bash
read -p "请输入一个用户名:" user_name
id $user_name &> /dev/null
#grep $username /etc/passwd &> /dev/null
if [ $? = 0 ];then
    echo "该用户存在"
else
    echo "该用户不存在"
fi
脚本判断内核版本

题目:判断当前内核主版本是否为2,且次版本是否大于等于6;如果都满足则输出当前内核版本
思路:

  1. 先查看内核的版本号 uname -r
  2. 先将内核的版本号保存到一个变量里,然后再根据需求截取出该变量的一部分:主版本和次版本
  3. 根据需求进步判断
#!/bin/bash
kernel=`uname -r`
var1=`echo $kernel|cut -d. -f1`
var2=`echo $kernel|cut -d. -f2`
test $var1 -eq 2 -a $var2 -ge 6 && echo $kernel || echo "当前内核版本不符合要求"
或者
[ $var1 -eq 2 -a $var2 -ge 6 ] && echo $kernel || echo "当前内核版本不符合要求"
或者
[[ $var1 -eq 2 && $var2 -ge 6 ]] && echo $kernel || echo "当前内核版本不符合要求"

或者

#!/bin/bash
kernel=`uname -r`
test ${kernel:0:1} -eq 2 -a ${kernel:2:1} -ge 6 && echo $kernel || echo '不符合要求'

其他命令参考:

uname -r|grep ^2.[6-9] || echo '不符合要求'
传不同值做不同事

题目:当给程序传入start、stop、restart三个不同参数时分别执行相应命令

#!/bin/env bash
case $1 in
        start|S)
        service apache start &>/dev/null && echo "apache 启动成功"
        ;;
        stop|T)
        service apache stop &>/dev/null && echo "apache 停止成功"
        ;;
        restart|R)
        service apache restart &>/dev/null && echo "apache 重启完毕"
        ;;
        *)
        echo "请输入要做的事情..."
        ;;
esac
根据用户需求选择做事

题目:脚本提示让用户输入需要管理的服务名,然后提示用户需要对服务做什么操作,如启动,关闭等操作

#!/bin/env bash
read -p "请输入你要管理的服务名称(vsftpd):" service
case $service in
        vsftpd|ftp)
        read -p "请选择你需要做的事情(restart|stop):" action
        case $action in
                stop|S)
                service vsftpd stop &>/dev/null && echo "该$serivce服务已经停止成功"
                ;;
                start)
                service vsftpd start &>/dev/null && echo "该$serivce服务已经成功启动"
                ;;
        esac
        ;;
        httpd|apache)
        echo "apache hello world"
        ;;
        *)
        echo "请输入你要管理的服务名称(vsftpd)"
        ;;
esac
文章来源:https://blog.csdn.net/qq_45157350/article/details/135167534
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。