MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Bash条件语句if-else实战

2023-12-101.9k 阅读

Bash条件语句if - else基础

if语句基本结构

在Bash脚本中,if语句用于根据条件执行不同的命令块。其最基本的结构如下:

if [ condition ]; then
    commands
fi

这里的[ condition ]是条件判断部分,commands是当条件为真(true)时要执行的命令集合。注意[condition以及]之间都要有空格,fi表示if语句的结束。

例如,我们要判断一个文件是否存在,如果存在则输出提示信息:

#!/bin/bash
file="test.txt"
if [ -e $file ]; then
    echo "$file 文件存在"
fi

在上述代码中,-e是文件测试操作符,用于检查文件是否存在。如果test.txt文件存在,就会输出test.txt 文件存在

if - else结构

if - else结构在if的基础上增加了条件为假(false)时的执行分支,结构如下:

if [ condition ]; then
    commands1
else
    commands2
fi

condition为真时,执行commands1;当condition为假时,执行commands2

比如,我们判断一个数是否大于10:

#!/bin/bash
num=5
if [ $num -gt 10 ]; then
    echo "$num 大于10"
else
    echo "$num 不大于10"
fi

这里-gt是数值比较操作符,表示大于。由于5不大于10,所以会输出5 不大于10

if - elif - else结构

if - elif - else结构允许我们进行多个条件的连续判断,结构如下:

if [ condition1 ]; then
    commands1
elif [ condition2 ]; then
    commands2
else
    commands3
fi

首先判断condition1,如果为真则执行commands1并结束整个if - elif - else语句;如果condition1为假,则判断condition2,若condition2为真执行commands2并结束,否则执行commands3

假设我们要根据学生的成绩给出不同的评价:

#!/bin/bash
score=75
if [ $score -ge 90 ]; then
    echo "优秀"
elif [ $score -ge 80 ]; then
    echo "良好"
elif [ $score -ge 60 ]; then
    echo "及格"
else
    echo "不及格"
fi

这里-ge表示大于等于。因为75大于等于60且小于80,所以会输出及格

条件判断的类型

数值比较

在Bash中,有多种数值比较操作符,常用的如下:

  • -eq:等于
  • -ne:不等于
  • -gt:大于
  • -lt:小于
  • -ge:大于等于
  • -le:小于等于

例如,判断两个数是否相等:

#!/bin/bash
a=10
b=10
if [ $a -eq $b ]; then
    echo "$a 等于 $b"
else
    echo "$a 不等于 $b"
fi

此代码会输出10 等于 10,因为ab的值相等,-eq比较结果为真。

字符串比较

字符串比较也有一系列操作符:

  • =:字符串相等
  • !=:字符串不相等
  • -z:字符串长度为0
  • -n:字符串长度不为0

下面是判断两个字符串是否相等的例子:

#!/bin/bash
str1="hello"
str2="world"
if [ $str1 = $str2 ]; then
    echo "$str1 和 $str2 相等"
else
    echo "$str1 和 $str2 不相等"
fi

显然helloworld不相等,所以会输出hello 和 world 不相等

再看判断字符串是否为空的例子:

#!/bin/bash
empty_str=""
if [ -z $empty_str ]; then
    echo "字符串为空"
else
    echo "字符串不为空"
fi

因为empty_str长度为0,所以会输出字符串为空

文件测试

文件测试用于检查文件的各种属性,常见的文件测试操作符有:

  • -e:文件或目录是否存在
  • -f:是否是普通文件
  • -d:是否是目录
  • -r:文件是否可读
  • -w:文件是否可写
  • -x:文件是否可执行

比如检查一个文件是否可执行:

#!/bin/bash
file="script.sh"
if [ -x $file ]; then
    echo "$file 可执行"
else
    echo "$file 不可执行"
fi

如果script.sh有可执行权限,就会输出script.sh 可执行

复合条件判断

逻辑与(&&)

在Bash中,逻辑与(&&)用于连接两个条件,只有当两个条件都为真时,整个复合条件才为真。其语法如下:

if [ condition1 ] && [ condition2 ]; then
    commands
fi

例如,我们要判断一个文件既存在又可读:

#!/bin/bash
file="test.txt"
if [ -e $file ] && [ -r $file ]; then
    cat $file
else
    echo "文件不存在或不可读"
fi

只有当test.txt文件存在且可读时,才会执行cat $file命令输出文件内容,否则输出文件不存在或不可读

逻辑或(||)

逻辑或(||)连接两个条件,只要其中一个条件为真,整个复合条件就为真。语法如下:

if [ condition1 ] || [ condition2 ]; then
    commands
fi

比如,判断一个数是否小于10或者大于20:

#!/bin/bash
num=5
if [ $num -lt 10 ] || [ $num -gt 20 ]; then
    echo "$num 满足条件"
else
    echo "$num 不满足条件"
fi

因为5小于10,所以满足复合条件,会输出5 满足条件

逻辑非(!)

逻辑非(!)用于对一个条件取反,即条件为真时,取反后为假;条件为假时,取反后为真。语法如下:

if [! condition ]; then
    commands
fi

例如,判断一个文件是否不存在:

#!/bin/bash
file="nonexistent.txt"
if [! -e $file ]; then
    echo "$file 不存在"
else
    echo "$file 存在"
fi

如果nonexistent.txt确实不存在,就会输出nonexistent.txt 不存在

if - else实战案例

系统资源检查脚本

下面我们编写一个检查系统资源的脚本,判断CPU使用率是否过高以及内存使用是否超过一定阈值。

#!/bin/bash
# 获取CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
# 获取内存使用率
mem_usage=$(free -h | awk '/Mem:/ {print $3/$2 * 100}' | cut -d. -f 1)

if [ $(echo "$cpu_usage > 80" | bc -l) -eq 1 ] && [ $(echo "$mem_usage > 80" | bc -l) -eq 1 ]; then
    echo "CPU使用率 $cpu_usage% 和内存使用率 $mem_usage% 均过高"
    echo "请检查系统负载"
elif [ $(echo "$cpu_usage > 80" | bc -l) -eq 1 ]; then
    echo "CPU使用率 $cpu_usage% 过高"
    echo "请检查CPU相关进程"
elif [ $(echo "$mem_usage > 80" | bc -l) -eq 1 ]; then
    echo "内存使用率 $mem_usage% 过高"
    echo "请检查内存占用进程"
else
    echo "系统资源使用正常"
fi

在这个脚本中,我们首先通过topfree命令获取CPU和内存使用率,然后使用bc工具进行数值比较。如果CPU和内存使用率都超过80%,输出相应提示;如果只有CPU使用率过高,或者只有内存使用率过高,也分别输出对应的提示;否则输出系统资源使用正常。

备份脚本中的条件判断

在备份脚本中,我们可以使用if - else语句来判断备份操作是否成功。

#!/bin/bash
source_dir="/home/user/data"
backup_dir="/backup/data"
timestamp=$(date +%Y%m%d%H%M%S)
backup_file="$backup_dir/data_$timestamp.tar.gz"

tar -czvf $backup_file $source_dir
if [ $? -eq 0 ]; then
    echo "备份成功,备份文件: $backup_file"
else
    echo "备份失败"
fi

这里$?是上一个命令的退出状态码,0表示命令成功执行。我们使用tar命令对source_dir进行打包压缩备份到backup_file,然后通过判断$?的值来确定备份是否成功,并输出相应的提示信息。

用户输入验证脚本

编写一个脚本,要求用户输入一个数字,然后判断该数字是否在指定范围内。

#!/bin/bash
echo "请输入一个1到100之间的数字"
read num

if [[ $num =~ ^[0-9]+$ ]]; then
    if [ $num -ge 1 ] && [ $num -le 100 ]; then
        echo "你输入的数字 $num 在范围内"
    else
        echo "你输入的数字不在1到100之间"
    fi
else
    echo "你输入的不是一个有效的数字"
fi

在这个脚本中,首先使用read命令获取用户输入。然后通过正则表达式[[ $num =~ ^[0-9]+$ ]]判断输入是否为数字。如果是数字,再判断是否在1到100之间,并输出相应信息;如果不是数字,则提示输入无效。

嵌套if - else

嵌套if - else结构解析

嵌套if - else是指在一个ifelse分支内再包含另一个if - else语句。其基本结构如下:

if [ condition1 ]; then
    if [ condition2 ]; then
        commands1
    else
        commands2
    fi
else
    commands3
fi

首先判断condition1,如果为真,再判断condition2,根据condition2的结果执行commands1commands2;如果condition1为假,则执行commands3

嵌套if - else实战示例

假设我们要根据用户输入的年龄和性别来输出不同的信息。

#!/bin/bash
echo "请输入你的年龄"
read age
echo "请输入你的性别(男/女)"
read gender

if [ $age -ge 18 ]; then
    if [ "$gender" = "男" ]; then
        echo "成年男性"
    else
        echo "成年女性"
    fi
else
    if [ "$gender" = "男" ]; then
        echo "未成年男性"
    else
        echo "未成年女性"
    fi
fi

在这个脚本中,首先根据年龄判断是否成年,然后在成年和未成年的分支内再根据性别输出不同信息。

注意事项

空格的重要性

在条件判断语句[ condition ]中,[condition]之间必须有空格。例如,[ -e $file ]是正确的,而[-e$file]是错误的,这会导致语法错误。

双括号与双方括号的区别

在Bash中,除了[ condition ]这种传统的条件判断方式,还有(( expression ))[[ condition ]](( expression ))主要用于整数运算和比较,它支持更多的算术操作符,比如++--等。而[[ condition ]]相比[ condition ]更强大,支持字符串模式匹配等功能,并且在处理字符串比较时更安全,不易出现语法错误。例如,使用[[ $str1 = $str2 ]][ $str1 = $str2 ]在处理包含特殊字符的字符串时更可靠。

退出状态码的理解

if语句根据命令的退出状态码来判断条件是否为真。一般来说,退出状态码为0表示命令成功执行,即条件为真;非0值表示命令执行失败,条件为假。在实际编写脚本时,要清楚了解所调用命令的退出状态码含义,以便正确使用if - else语句进行条件判断。

通过以上对Bash条件语句if - else的深入讲解和丰富的实战示例,相信你已经对如何在Bash脚本中灵活运用if - else语句有了更全面的认识。在实际的脚本编写中,根据具体需求合理运用这些知识,能够编写出功能强大且健壮的脚本。