shell脚本语法判断流程控制语句

Posted HeiDi_BoKe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本语法判断流程控制语句相关的知识,希望对你有一定的参考价值。

目录

一、判断用户参数

1.1 文件判断参数

PS:$?代表上一个命令的返回值,为0表示正确执行,非0表示错误执行。详情可参考我另一篇博客:https://www.cnblogs.com/HeiDi-BoKe/p/11635473.html

补充:逻辑语句有三个(与:&&,或:||,非:!)

实例:

1.2 比较运算符

实例:

# FreeMem=`free -m | grep Mem: | awk \'{print $4}`
# echo $FreeMem

1.3 字符串比较符

 

实例:

 

二、流程控制语句

  下面介绍if、for、while、case这4中流程控制语句

2.1 if条件判断语句

  if语句分为单分支,双分支,多分支

2.1.1 if单分支语句

  单分支语句结构由if、then、fi关键词组成,只在条件成立才执行预设的语句。即如果...那么...

语法:

if 条件表达式;then
    命令
fi

 

 

实例:

# vi ifDemo.sh
#!/bin/bash
DIR=/tmp/test/
if [ ! -e $DIR ];then
        echo "$DIR 目录不存在"
        mkdir -p /tmp/test
fi
echo "$DIR 目录已存在"

 

2.1.2 if双分支语句

  双分支语句结构由if、then、else、fi关键词组成,判断第一次的条件,如果匹配则执行,如果不匹配则执行else后面的命令。即如果...那么...或者...那么...

语法:

if 条件表达式;then
     命令1
else 
    命令2
fi

 

实例:

# 验证某台主机是否在线(这里使用从参数读取ip和直接写脚本中)
# ping -c 指定次数,-i指定每个数据发送的间隔 -W指定等待时间
# 方法一:从参数读取ip
# vi ifelseDemo.sh
#!/bin/bash
if [ $# -eq 0 ];then
        echo "[usage] 请使用./ifelseDemo.sh ip地址"
        exit 0 
fi
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ];then
        echo "$1 是通的"
else
        echo "$1 是不通的"
fi

#方法二:将ip直接写脚本里
# vi ifelseDemo2.sh 
#!/bin/bash
if `ping -c 3 106.53.73.200 &> /dev/null`;then
        echo "通的"
else
        echo "不通"
fi

2.1.3 if多分支语句

  多分支语句结构由if、then、else、elif、fi关键词组成,进行多次条件匹配,匹配成功则执行对应的预设语句。即如果...那么..如果...那么...

语法:

if 条件语句1;then
    命令1
elif 条件语句2;then
    命令2
...
else
    命令
fi

实例:

# vi grade.sh
#!/bin/bash
read -p "请输入你的成绩(0-100): " GRADE
if [ $GRADE -gt 100 ] || [ $GRADE -lt 0 ];then
echo "[info] 您输入的成绩无效,请输入(0-100)之间包括0和100的数"
elif [ $GRADE -ge 85 ] && [ $GRADE -le 100 ];then
echo "$GRADE is Execllent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ];then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi

注意:一个[]表示判断文件或目录等是否存在,两个[[]]表示做运算判断(也可以写成[] && []或[] || [])

2.2 for循环语句

  for语句能一次读取多个信息,然后逐一对信息进行操作处理

语法:

语法一:
for
变量名 in 取值列表 do 命令 done
语法二:
for ((expr1;expr2;expr3));do 命令列表 done 

 

实例:

# 提前准备好用户的文件
[root@VM_0_10_centos shellScript]# vi username.txt
test01
test02
test03
test04
test05
test06
# vi example.sh
#!/bin/bash
read -p "请输入用户密码:" PASSWD
for UNAME in `cat username.txt`
do
        id $UNAME &> /dev/null
        if [ $? -eq 0 ]
        then
            echo "$UNAME user is exists"
        else
            useradd $UNAME &> /dev/null
            echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
        if [ $? -eq 0 ]
        then
            echo "$UNAME,Create success"
        else
            echo "$UNAME,Create failure"
        fi
        fi
done
# 大于数字1小于数字10
# cat for.sh
#!/bin/bash
for ((i=1;i<10;i++))
do
    echo $i
done
# 结果
# ./for.sh 
1
2
3
4
5
6
7
8
9
# 检查多个主机是否存活
# cat ip.sh 
#!/bin/bash
for IP in ip地址
do
    if `ping -c 2 $IP &> /dev/null`
    then
        echo -e "$IP OK"
    else
        echo "$IP NO"
    fi
done
# 结果
# ./ip.sh 
ip地址 OK
ip地址 OK
# 检查多个域名是否可以访问
# cat http.sh 
#!/bin/bash
URL="域名1 www.baidu.com"
for i in $URL
do
HTTP=`curl -i -m 10 -o /dev/null -s -w %{http_code}"\\n" http://$i`
    if [ $HTTP -eq 200 -o $HTTP -eq 301 ]
    then
        echo "$i OK"
    else
        echo "$i NO"
    fi
done
# 结果
# ./http.sh 
域名1 NO
www.baidu.com OK

2.3 while语句

  while语句通过判断条件的真假来决定是否执行命令。条件为真则执行,为假则结束循环。当表达式为true时,会变成死循环

语法:

while 条件
do
    命令
done

参考我另一篇博客:https://www.cnblogs.com/HeiDi-BoKe/p/13072979.html

 

补充:

1)break:终止循环

2)continue:跳出当前循环,执行下一个循环

2.4 case条件语句

  用于选择性的执行对应的命令

语法:

case 模块名 in
模式1)
    命令;;
模式2)
    命令;;
...
*)
    命令
esac

 

实例:

# cat case.sh 
#!/bin/bash
read -p "请输入任意字符,并按Enter键确认:" KEY
case $KEY in
[a-z][A-Z])
    echo "您输入是字母。"
    ;;
[0-9])
    echo "您输入是数字。"
    ;;
*)
    echo "您输入是空格,下划线,功能键或其他"
esac

 

2.5 Until循环语句

# 知道满足条件才退出,否则执行action
until 条件
do
    action
done

 

三、选择语句

select语句:

select 变量名 in 语句
do
    action
done
[root@rhel8 shell]# cat select_menu.sh
#!/bin/bash

PS3="Select your will exec Menu:"

select i in "Apache" "mysql" "php"

do

    case $i in

        Apache)
            echo "wait install httpd server..."
            ;;
        MySQL)
            echo "wait install MySQL server..."
            ;;
        PHP)
            echo "wait install PHP server..."
            ;;
        *)
            echo -e "\\033[32mUsage: { $0 Apache|MySQL|PHP|help}\\033[0m"
            ;;
    esac
done

 

以上是关于shell脚本语法判断流程控制语句的主要内容,如果未能解决你的问题,请参考以下文章

Linux | shell脚本-条件判断if和循环语句for

shell脚本流程控制

Linux shell脚本流程控制

shell脚本流程控制

shell脚本流程控制

shell脚本流程控制