SHELL-IF

作者dmxsp

12月 5, 2023

1.if的基本语法

if与[之间要有空格
[]与判断条件之间也必须有空格
]与;之间不能有空格

2.对字符串的判断

if [ str1=str2 ];then fi #当两个字符串相同时返回真
if [ str1!=str2 ];then fi #当两个字符串不相等时返回真
if [ -n str1 ];then fi #当字符串的长度大于0时返回真 (判断变量是否有值)
if [ -z str1 ];then fi #当字符串的长度为0时返回真

3.格式

单分支语句结构

if [ 条件表达式 ]; then
    指令 
fi

双分支语句结构

if [ 条件表达式 ]; then 
    指令一 
else 
    指令二 
fi

多分支语句结构

if [ -f file ]; then
   echo "yes yes yes"
elif [ -z file ]; then
   echo "yes yes"
else
   echo "nonono"
fi

4.if else

单独的一个 if else 语句,如下所示:

if condition
then
    符合 condition 的执行语句
else
    不符合 condition 的执行语句
fi

这里 then 也可以写到与 if 在一行中。

if else 语句

#!/bin/bash
 
file="/root"
if [ -d $file ]
then
    echo "$file is directory!"
else
    echo "$file is not directory!"
fi

5.if elif

注意:Shell 里将 else if 简写为 elif,elif 也要有 then,如下所示:

if condition_1
then
    符合 condition_1 的执行语句
elif condition_2
then
    符合 condition_2 的执行语句
else 
    不符合 condition_1 和 condition_2 的执行语句
fi

if elif 语句

#!/bin/bash
 
file="/root"
if [ -f $file ]
then
    echo "$file is regular file!"
elif [ -d $file ]
then
    echo "$file is directory!"
else
    echo "$file is not regular file and directory"
fi

6.else和elif区别

在Shell脚本中,else和elif都是用于在if语句中处理多个条件的关键字。

else:else关键字用于在if语句中处理当条件为假时执行的代码块。当if语句中的条件为假时,else后面的代码块将被执行。

例如:

if [ condition ]; then
    # 如果条件为真,则执行这里的代码
else
    # 如果条件为假,则执行这里的代码
fi

elif:elif关键字用于在if语句中处理多个条件的情况。当if语句中的第一个条件为假时,会检查elif后面的条件,如果有条件为真,则执行对应的代码块。

例如:

if [ condition1 ]; then
    # 如果条件1为真,则执行这里的代码
elif [ condition2 ]; then
    # 如果条件1为假,但条件2为真,则执行这里的代码
else
    # 如果条件1和条件2都为假,则执行这里的代码
fi

因此,else用于处理if语句中的默认情况(即当所有条件都为假时执行的代码),而elif用于处理多个条件的情况,当第一个条件为假时,检查下一个条件。这两个关键字在if语句中一起使用,可以实现更复杂的条件逻辑。

7.条件表达式的内容

字符串的判断

str1 = str2      当两个串有相同内容、长度时为真
str1 != str2      当串str1和str2不等时为真
-n str1        当串的长度大于0时为真(串非空)
-z str1        当串的长度为0时为真(空串)
str1         当串str1为非空时为真

数字的判断

int1 -eq int2    两数相等为真
int1 -ne int2    两数不等为真
int1 -gt int2    int1大于int2为真
int1 -ge int2    int1大于等于int2为真
int1 -lt int2    int1小于int2为真
int1 -le int2    int1小于等于int2为真

文件的判断

-r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真

复杂逻辑判断

条件表达式中可能有多个条件,需要使用与或非等逻辑操作。

-a:与 
-o:或 
!:非

案例

#!/bin/bash
read -p “请输入你的分数:” score
if [ $score -ge 0 ]&&[ $score -lt 60 ];then
echo “sorry,you are lost!”
elif [ $score -ge 60 ]&&[ $score -lt 85 ];then
echo “just soso!”
elif [ $score -le 100 ]&&[ $score -ge 85 ];then
echo “good job!”
else
echo “input score is wrong , the range is [0-100]!”
fi

当然,上面的实例也可以用 -a 来改写:

#!/bin/bash
read -p “请输入你的分数:” score
if [ $score -ge 0 -a $score -lt 60 ];then
echo “sorry,you are lost!”
elif [ $score -ge 60 -a $score -lt 85 ];then
echo “just soso!”
elif [ $score -le 100 -a $score -ge 85 ];then
echo “good job!”
else
echo “input score is wrong , the range is [0-100]!”
fi

输入两个整数 使用if判断两个整数谁大谁小或等于

[root@shell /server/scripts]$ cat count3.sh
#!/bin/sh
read -p “请输入两个整数: ” num1 num2
expr $num1 + $num2 &>/dev/null
if [ $? -ne 0 ];then
echo 请输入正确的数字
exit
fi
if [ $num1 -gt $num2 ]
then
echo “$num1>$num2”
elif [ $num1 -lt $num2 ]
then
  echo “$num1<$num2”
else
  echo “$num1=$num2”
fi
[root@shell /server/scripts]$ sh count3.sh
请输入两个整数: 12  15
12<15

通过不同的系统版本号 安装不同的YUM源

[root@shell /server/scripts]$ cat yum.sh
#!/bin/bash
#centos6和centos7获取当前文件中的列不同
os_ver=`cat /etc/redhat-release |awk ‘{print $(NF-1)}’`
if [ ${os_ver%%.*} -eq 7 ]
then
    ping -c2 -W1 114.114.114.114 &>/dev/null
    if [ $? -ne 0 ];then
       echo “网络不通正在重启网络请稍后……”
       systemctl restart network
           ping -c2 -W1 114.114.114.114 &>/dev/null
   [ $? -ne 0 ] && echo “sendmail……管理员请尽快检查服务器的网络”
    fi
    if  [ `rpm -qa wget|wc -l` -eq 0 ];then
        yum -y install wget &>/dev/null
        if  [ $? -eq 0 ];then
    echo “wget 安装成功…….”
        else
            echo “安装失败 检查网络或YUM源…..”
  fi
    fi
    wget -O /etc/yum.repos.d/shell-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &>/dev/null
    if [ $? -eq 0 ];then
       echo “YUM源更新成功”
    else
       echo “YUM源更新不成功 可能是由于网络引起”
    fi
elif [ ${os_ver%%.*} -eq 6 ]
then
    wget -O /etc/yum.repos.d/shell-epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
else
    echo “请检查您的系统版本”
        if [ $? -eq 0 ];then
       echo “YUM源更新成功”
    else
       echo “YUM源更新不成功 可能是由于网络引起”
    fi
fi

8.二级菜单

在Shell脚本中,二级菜单是指一个菜单系统中的第二层菜单,通常用于提供更多的选项和功能。二级菜单通常在用户选择一级菜单中的选项后出现,以便用户进一步细化他们的选择。

在Shell脚本中创建二级菜单通常使用嵌套的case语句或者多个if-else语句来实现。一般情况下,一级菜单会提示用户选择一个选项,然后根据用户的选择进入相应的二级菜单。在二级菜单中,用户可以再次选择一个选项,然后执行相应的操作或者进入更深层的菜单。

二级菜单在Shell脚本中通常用于提供更多的选项和功能,使得脚本更加灵活和交互性更强。它可以用于管理多个选项和版本,执行不同的操作,或者进一步细化用户的选择。

创建一个二级菜单需要考虑用户输入的合法性,以及根据用户的选择执行相应的操作。合理设计和实现二级菜单可以使Shell脚本更加友好和易用

shell二级菜单case

在Shell脚本中,可以使用case语句来实现二级菜单。case语句允许你根据用户的输入进行多个选项的匹配,从而执行相应的操作。

下面是一个简单的示例,演示了如何使用case语句实现二级菜单:

echo "Select an option:"
echo "1. Option 1"
echo "2. Option 2"
read FIRST_OPTION

case $FIRST_OPTION in
  1)
    echo "You selected Option 1"
    # 进入第二级菜单
    echo "Select a sub-option:"
    echo "a. Sub-option A"
    echo "b. Sub-option B"
    read SUB_OPTION

    case $SUB_OPTION in
      a)
        echo "You selected Sub-option A"
        # 在这里添加Sub-option A的相关代码
        ;;
      b)
        echo "You selected Sub-option B"
        # 在这里添加Sub-option B的相关代码
        ;;
      *)
        echo "Invalid sub-option"
        ;;
    esac
    ;;
  2)
    echo "You selected Option 2"
    # 在这里添加Option 2的相关代码
    ;;
  *)
    echo "Invalid option"
    ;;
esac

在上面的示例中,根据用户选择的第一级选项,进入了相应的二级菜单。在二级菜单中,使用了嵌套的case语句来处理用户的进一步选择。

通过合理设计和嵌套case语句,可以实现复杂的菜单系统,提供更多选项和功能,使得Shell脚本更加灵活和交互性更强。

shell二级菜单if-else

在Shell脚本中,也可以使用多个嵌套的if-else语句来实现二级菜单。通过逐级的条件判断,可以让用户在不同的选项下进入不同的二级菜单或执行不同的操作。

以下是一个简单的示例,演示了如何使用if-else语句实现二级菜单:

echo "Select an option:"
echo "1. Option 1"
echo "2. Option 2"
read FIRST_OPTION

if [ $FIRST_OPTION -eq 1 ]; then
  echo "You selected Option 1"
  # 进入第二级菜单
  echo "Select a sub-option:"
  echo "a. Sub-option A"
  echo "b. Sub-option B"
  read SUB_OPTION

  if [ "$SUB_OPTION" = "a" ]; then
    echo "You selected Sub-option A"
    # 在这里添加Sub-option A的相关代码
  elif [ "$SUB_OPTION" = "b" ]; then
    echo "You selected Sub-option B"
    # 在这里添加Sub-option B的相关代码
  else
    echo "Invalid sub-option"
  fi

elif [ $FIRST_OPTION -eq 2 ]; then
  echo "You selected Option 2"
  # 在这里添加Option 2的相关代码

else
  echo "Invalid option"
fi

在上面的示例中,根据用户选择的第一级选项,通过多个嵌套的if-else语句进入了相应的二级菜单或执行相应的操作。

使用if-else语句实现二级菜单同样可以达到和case语句类似的效果,只是代码结构略有不同。合理设计和嵌套if-else语句同样可以实现复杂的菜单系统,提供更多选项和功能,使得Shell脚本更加灵活和交互性更强。

f-else和case的区别

在Shell脚本中,if-else语句和case语句都用于进行条件判断和分支控制,但它们在语法结构和适用场景上有一些区别。

if-else语句:

用于对条件进行逐一判断,根据条件的真假执行不同的代码块。

适用于需要进行复杂的条件判断,每个条件可能是一个表达式,可以使用逻辑运算符(如&&、||)组合多个条件。

语法结构较为灵活,可以处理各种复杂的条件逻辑。

适用于需要对范围、大小关系等复杂条件进行判断的情况。

case语句:

用于根据一个变量的取值,执行与每个取值相关联的代码块。

适用于需要进行多个取值的简单匹配,每个取值对应一个代码块。

语法结构简洁,适用于处理多个取值的情况,可以使得代码更加清晰和易读。

适用于对多个离散取值进行匹配的情况,例如菜单选择、状态判断等。

总的来说,if-else语句适用于复杂的条件判断,而case语句适用于对多个离散取值进行匹配。在实际编程中,根据具体的条件逻辑和需求,可以灵活选择使用if-else语句或case语句。

案例

[root@shell /server/scripts]$ cat er.sh 
#!/bin/bash

# 一级菜单
echo "Select a service:"
echo "1. Nginx"
echo "2. PHP"
echo "3. Redis"
echo "4. MySQL"
read FIRST_OPTION

case $FIRST_OPTION in
  1)
    # 二级菜单 - Nginx
    echo "Select a version of Nginx:"
    echo "a. Nginx 1.18"
    echo "b. Nginx 1.20"
    echo "c. Nginx 1.22"
    read NGINX_OPTION

    case $NGINX_OPTION in
      a)
        echo "You selected Nginx 1.18"
        # 在这里添加Nginx 1.18的相关代码
        ;;
      b)
        echo "You selected Nginx 1.20"
        # 在这里添加Nginx 1.20的相关代码
        ;;
      c)
        echo "You selected Nginx 1.22"
        # 在这里添加Nginx 1.22的相关代码
        ;;
      *)
        echo "Invalid option"
        ;;
    esac
    ;;
  2)
    # 二级菜单 - PHP
    echo "Select a version of PHP:"
    echo "x. PHP 7.3"
    echo "y. PHP 7.4"
    echo "z. PHP 8.0"
    read PHP_OPTION

    case $PHP_OPTION in
      x)
        echo "You selected PHP 7.3"
        # 在这里添加PHP 7.3的相关代码
        ;;
      y)
        echo "You selected PHP 7.4"
        # 在这里添加PHP 7.4的相关代码
        ;;
      z)
        echo "You selected PHP 8.0"
        # 在这里添加PHP 8.0的相关代码
        ;;
      *)
        echo "Invalid option"
        ;;
    esac
    ;;
  3)
    # 二级菜单 - Redis
    echo "Select a version of Redis:"
    echo "m. Redis 5.0"
    echo "n. Redis 6.0"
    echo "o. Redis 6.2"
    read REDIS_OPTION

    case $REDIS_OPTION in
      m)
        echo "You selected Redis 5.0"
        # 在这里添加Redis 5.0的相关代码
        ;;
      n)
        echo "You selected Redis 6.0"
        # 在这里添加Redis 6.0的相关代码
        ;;
      o)
        echo "You selected Redis 6.2"
        # 在这里添加Redis 6.2的相关代码
        ;;
      *)
        echo "Invalid option"
        ;;
    esac
    ;;
  4)
    # 二级菜单 - MySQL
    echo "Select a version of MySQL:"
    echo "p. MySQL 5.7"
    echo "q. MySQL 8.0"
    echo "r. MySQL 8.0"
    read MYSQL_OPTION

    case $MYSQL_OPTION in
      p)
        echo "You selected MySQL 5.7"
        # 在这里添加MySQL 5.7的相关代码
        ;;
      q)
        echo "You selected MySQL 8.0"
        # 在这里添加MySQL 8.0的相关代码
        ;;
      r)
        echo "You selected MySQL 8.0"
        # 在这里添加MySQL 8.0的相关代码
        ;;
      *)
        echo "Invalid option"
        ;;
    esac
    ;;
  *)
    echo "Invalid option"
    ;;
esac

 

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。