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

Bash条件语句与分支结构

2021-07-277.7k 阅读

条件测试

在Bash脚本编程中,条件测试是构建条件语句和分支结构的基础。条件测试用于判断特定的条件是否成立,以便决定脚本的执行路径。Bash提供了多种条件测试的方式,下面我们详细介绍。

文件测试

文件测试用于检查文件的各种属性。常见的文件测试操作符如下:

  1. -e:检查文件或目录是否存在。
#!/bin/bash
file="test.txt"
if [ -e $file ]; then
    echo "$file存在"
else
    echo "$file不存在"
fi

在上述代码中,使用[ -e $file ]来测试test.txt文件是否存在。如果存在则输出相应提示,不存在则输出另一条提示。

  1. -f:检查文件是否为普通文件(非目录、设备文件等)。
#!/bin/bash
file="test.sh"
if [ -f $file ]; then
    echo "$file是普通文件"
else
    echo "$file不是普通文件"
fi

此脚本判断test.sh是否为普通文件。

  1. -d:检查文件是否为目录。
#!/bin/bash
dir="my_dir"
if [ -d $dir ]; then
    echo "$dir是目录"
else
    echo "$dir不是目录"
fi

该代码判断my_dir是否为一个目录。

  1. -r:检查文件是否可读。
#!/bin/bash
file="readme.txt"
if [ -r $file ]; then
    echo "$file可读"
else
    echo "$file不可读"
fi

用于判断readme.txt文件是否具有可读权限。

  1. -w:检查文件是否可写。
#!/bin/bash
file="writeable.txt"
if [ -w $file ]; then
    echo "$file可写"
else
    echo "$file不可写"
fi

这段代码判断writeable.txt文件是否可写。

  1. -x:检查文件是否可执行。
#!/bin/bash
file="script.sh"
if [ -x $file ]; then
    echo "$file可执行"
else
    echo "$file不可执行"
fi

用于判断script.sh脚本文件是否可执行。

数值比较

数值比较用于对两个数值进行大小等关系的判断。常用的数值比较操作符如下:

  1. -eq:等于。
#!/bin/bash
num1=10
num2=10
if [ $num1 -eq $num2 ]; then
    echo "$num1等于$num2"
else
    echo "$num1不等于$num2"
fi

该脚本判断num1num2是否相等。

  1. -ne:不等于。
#!/bin/bash
num1=15
num2=20
if [ $num1 -ne $num2 ]; then
    echo "$num1不等于$num2"
else
    echo "$num1等于$num2"
fi

此代码判断num1num2是否不相等。

  1. -gt:大于。
#!/bin/bash
num1=25
num2=20
if [ $num1 -gt $num2 ]; then
    echo "$num1大于$num2"
else
    echo "$num1不大于$num2"
fi

用于判断num1是否大于num2

  1. -lt:小于。
#!/bin/bash
num1=18
num2=20
if [ $num1 -lt $num2 ]; then
    echo "$num1小于$num2"
else
    echo "$num1不小于$num2"
fi

这段代码判断num1是否小于num2

  1. -ge:大于等于。
#!/bin/bash
num1=20
num2=20
if [ $num1 -ge $num2 ]; then
    echo "$num1大于等于$num2"
else
    echo "$num1小于$num2"
fi

用于判断num1是否大于等于num2

  1. -le:小于等于。
#!/bin/bash
num1=18
num2=20
if [ $num1 -le $num2 ]; then
    echo "$num1小于等于$num2"
else
    echo "$num1大于$num2"
fi

该脚本判断num1是否小于等于num2

字符串比较

字符串比较用于判断两个字符串之间的关系。常见的字符串比较操作符如下:

  1. =:检查两个字符串是否相等。
#!/bin/bash
str1="hello"
str2="hello"
if [ $str1 = $str2 ]; then
    echo "$str1等于$str2"
else
    echo "$str1不等于$str2"
fi

此代码判断str1str2两个字符串是否相等。

  1. !=:检查两个字符串是否不相等。
#!/bin/bash
str1="world"
str2="hello"
if [ $str1 != $str2 ]; then
    echo "$str1不等于$str2"
else
    echo "$str1等于$str2"
fi

用于判断str1str2是否不相等。

  1. -z:检查字符串是否为空(长度为0)。
#!/bin/bash
str=""
if [ -z $str ]; then
    echo "字符串为空"
else
    echo "字符串不为空"
fi

该脚本判断str字符串是否为空。

  1. -n:检查字符串是否不为空(长度大于0)。
#!/bin/bash
str="not empty"
if [ -n $str ]; then
    echo "字符串不为空"
else
    echo "字符串为空"
fi

这段代码判断str字符串是否不为空。

if 条件语句

if条件语句是Bash中最基本的条件控制结构,它根据条件测试的结果来决定是否执行特定的代码块。

基本语法

if condition; then
    commands
fi

其中,condition是条件测试表达式,commands是当条件成立时要执行的命令。例如:

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

在这个例子中,[ $num -gt 5 ]是条件测试,如果num大于5,就会输出“数字大于5”。

if - else 结构

if - else结构允许在条件成立和不成立时分别执行不同的代码块。

if condition; then
    commands1
else
    commands2
fi

例如:

#!/bin/bash
num=3
if [ $num -gt 5 ]; then
    echo "数字大于5"
else
    echo "数字小于等于5"
fi

这里,当num大于5时执行echo "数字大于5",否则执行echo "数字小于等于5"

if - elif - else 结构

if - elif - else结构可以处理多个条件的情况。

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

示例:

#!/bin/bash
score=75
if [ $score -ge 90 ]; then
    echo "成绩为A"
elif [ $score -ge 80 ]; then
    echo "成绩为B"
elif [ $score -ge 70 ]; then
    echo "成绩为C"
else
    echo "成绩为D"
fi

该脚本根据score的值判断成绩等级,依次检查各个条件,满足条件则执行相应的echo语句。

case 分支结构

case分支结构用于根据不同的值执行不同的代码块,类似于其他语言中的switch - case语句。

基本语法

case variable in
pattern1)
    commands1
    ;;
pattern2)
    commands2
    ;;
*)
    commands3
    ;;
esac

其中,variable是要匹配的变量,pattern1pattern2等是匹配模式,commands1commands2等是匹配成功后要执行的命令,;;表示命令块的结束,*是默认匹配模式。

示例

#!/bin/bash
fruit="apple"
case $fruit in
"apple")
    echo "这是苹果"
    ;;
"banana")
    echo "这是香蕉"
    ;;
*)
    echo "不知道这是什么水果"
    ;;
esac

在这个例子中,fruit变量的值与各个模式进行匹配,匹配到"apple"模式,所以输出“这是苹果”。如果fruit的值为"banana",则会输出“这是香蕉”,其他值则会输出“不知道这是什么水果”。

复合条件测试

在实际应用中,我们经常需要组合多个条件进行测试,Bash提供了逻辑操作符来实现复合条件测试。

逻辑与(&&)

逻辑与操作符&&用于连接两个条件,只有当两个条件都成立时,整个复合条件才成立。

#!/bin/bash
num1=10
num2=20
if [ $num1 -gt 5 ] && [ $num2 -lt 30 ]; then
    echo "两个条件都满足"
else
    echo "至少一个条件不满足"
fi

在此脚本中,[ $num1 -gt 5 ][ $num2 -lt 30 ]两个条件必须都成立,if语句中的代码块才会执行。

逻辑或(||)

逻辑或操作符||连接两个条件,只要其中一个条件成立,整个复合条件就成立。

#!/bin/bash
num1=3
num2=20
if [ $num1 -gt 5 ] || [ $num2 -lt 30 ]; then
    echo "至少一个条件满足"
else
    echo "两个条件都不满足"
fi

在这个例子中,[ $num1 -gt 5 ]不成立,但[ $num2 -lt 30 ]成立,所以整个复合条件成立,if语句中的代码块会执行。

逻辑非(!)

逻辑非操作符!用于取反条件,即如果条件原本成立,加上!后就不成立,反之亦然。

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

这里[! $num -gt 15 ]表示num不大于15,因为num为10,所以条件成立,输出“数字不大于15”。

条件语句中的命令替换

在条件语句中,我们可以使用命令替换来获取命令的输出并用于条件判断。命令替换有两种方式:$(command)和`command`(反引号)。推荐使用$(command)方式,因为它更易读且嵌套时更方便。

示例

#!/bin/bash
file_count=$(ls | wc -l)
if [ $file_count -gt 10 ]; then
    echo "文件数量大于10"
else
    echo "文件数量小于等于10"
fi

在这个脚本中,$(ls | wc -l)获取当前目录下的文件数量,将其赋值给file_count变量,然后通过[ $file_count -gt 10 ]判断文件数量是否大于10,并输出相应结果。

条件语句与脚本参数

Bash脚本可以接受参数,我们可以根据这些参数在条件语句中进行不同的操作。脚本参数通过$1$2$3等变量来访问,$0表示脚本本身的名称。

示例

#!/bin/bash
if [ $# -eq 0 ]; then
    echo "没有提供参数"
else
    echo "第一个参数是:$1"
    if [ "$1" = "help" ]; then
        echo "这是帮助信息"
    fi
fi

在这个脚本中,[ $# -eq 0 ]用于判断是否有参数传入,$#表示参数的个数。如果没有参数,输出“没有提供参数”;如果有参数,输出第一个参数,并判断第一个参数是否为"help",如果是则输出帮助信息。

条件语句中的算术扩展

在条件语句中,我们可以使用算术扩展进行数值计算并用于条件判断。算术扩展的语法是$((expression))

示例

#!/bin/bash
a=5
b=3
result=$((a + b))
if [ $result -gt 8 ]; then
    echo "结果大于8"
else
    echo "结果小于等于8"
fi

此脚本中,$((a + b))计算ab的和并赋值给result,然后通过[ $result -gt 8 ]判断结果是否大于8,并输出相应信息。

条件语句在循环中的应用

条件语句常常与循环结构结合使用,以实现更复杂的逻辑控制。例如,在for循环或while循环中,我们可以使用条件语句来决定是否继续循环或执行特定的操作。

在for循环中使用条件语句

#!/bin/bash
for num in 1 2 3 4 5; do
    if [ $num -eq 3 ]; then
        echo "遇到数字3,跳过本次循环"
        continue
    fi
    if [ $num -gt 4 ]; then
        echo "数字大于4,结束循环"
        break
    fi
    echo "当前数字:$num"
done

在这个for循环中,当num等于3时,通过continue跳过本次循环;当num大于4时,通过break结束循环。

在while循环中使用条件语句

#!/bin/bash
count=1
while [ $count -le 5 ]; do
    if [ $count -eq 3 ]; then
        echo "遇到数字3,跳过本次循环"
        ((count++))
        continue
    fi
    if [ $count -gt 4 ]; then
        echo "数字大于4,结束循环"
        break
    fi
    echo "当前数字:$count"
    ((count++))
done

在这个while循环中,同样通过条件语句实现了类似的跳过和结束循环的逻辑。

条件语句的嵌套

条件语句可以进行嵌套,即在一个条件语句的代码块中再包含另一个条件语句,以实现更复杂的条件判断逻辑。

示例

#!/bin/bash
num=15
if [ $num -gt 10 ]; then
    if [ $num -lt 20 ]; then
        echo "数字在10到20之间"
    else
        echo "数字大于等于20"
    fi
else
    echo "数字小于等于10"
fi

在这个脚本中,外层if判断num是否大于10,如果成立,内层if再判断num是否小于20,根据不同结果输出相应信息。

通过对Bash条件语句与分支结构的深入学习,我们可以编写出更加灵活、智能的脚本,满足各种不同的业务需求。无论是简单的文件属性判断,还是复杂的多层条件嵌套逻辑,都能够通过合理运用这些知识来实现。在实际编程中,不断练习和实践这些技巧,将有助于提升我们的脚本编程能力。