Bash条件语句与分支结构
条件测试
在Bash脚本编程中,条件测试是构建条件语句和分支结构的基础。条件测试用于判断特定的条件是否成立,以便决定脚本的执行路径。Bash提供了多种条件测试的方式,下面我们详细介绍。
文件测试
文件测试用于检查文件的各种属性。常见的文件测试操作符如下:
- -e:检查文件或目录是否存在。
#!/bin/bash
file="test.txt"
if [ -e $file ]; then
echo "$file存在"
else
echo "$file不存在"
fi
在上述代码中,使用[ -e $file ]
来测试test.txt
文件是否存在。如果存在则输出相应提示,不存在则输出另一条提示。
- -f:检查文件是否为普通文件(非目录、设备文件等)。
#!/bin/bash
file="test.sh"
if [ -f $file ]; then
echo "$file是普通文件"
else
echo "$file不是普通文件"
fi
此脚本判断test.sh
是否为普通文件。
- -d:检查文件是否为目录。
#!/bin/bash
dir="my_dir"
if [ -d $dir ]; then
echo "$dir是目录"
else
echo "$dir不是目录"
fi
该代码判断my_dir
是否为一个目录。
- -r:检查文件是否可读。
#!/bin/bash
file="readme.txt"
if [ -r $file ]; then
echo "$file可读"
else
echo "$file不可读"
fi
用于判断readme.txt
文件是否具有可读权限。
- -w:检查文件是否可写。
#!/bin/bash
file="writeable.txt"
if [ -w $file ]; then
echo "$file可写"
else
echo "$file不可写"
fi
这段代码判断writeable.txt
文件是否可写。
- -x:检查文件是否可执行。
#!/bin/bash
file="script.sh"
if [ -x $file ]; then
echo "$file可执行"
else
echo "$file不可执行"
fi
用于判断script.sh
脚本文件是否可执行。
数值比较
数值比较用于对两个数值进行大小等关系的判断。常用的数值比较操作符如下:
- -eq:等于。
#!/bin/bash
num1=10
num2=10
if [ $num1 -eq $num2 ]; then
echo "$num1等于$num2"
else
echo "$num1不等于$num2"
fi
该脚本判断num1
和num2
是否相等。
- -ne:不等于。
#!/bin/bash
num1=15
num2=20
if [ $num1 -ne $num2 ]; then
echo "$num1不等于$num2"
else
echo "$num1等于$num2"
fi
此代码判断num1
和num2
是否不相等。
- -gt:大于。
#!/bin/bash
num1=25
num2=20
if [ $num1 -gt $num2 ]; then
echo "$num1大于$num2"
else
echo "$num1不大于$num2"
fi
用于判断num1
是否大于num2
。
- -lt:小于。
#!/bin/bash
num1=18
num2=20
if [ $num1 -lt $num2 ]; then
echo "$num1小于$num2"
else
echo "$num1不小于$num2"
fi
这段代码判断num1
是否小于num2
。
- -ge:大于等于。
#!/bin/bash
num1=20
num2=20
if [ $num1 -ge $num2 ]; then
echo "$num1大于等于$num2"
else
echo "$num1小于$num2"
fi
用于判断num1
是否大于等于num2
。
- -le:小于等于。
#!/bin/bash
num1=18
num2=20
if [ $num1 -le $num2 ]; then
echo "$num1小于等于$num2"
else
echo "$num1大于$num2"
fi
该脚本判断num1
是否小于等于num2
。
字符串比较
字符串比较用于判断两个字符串之间的关系。常见的字符串比较操作符如下:
- =:检查两个字符串是否相等。
#!/bin/bash
str1="hello"
str2="hello"
if [ $str1 = $str2 ]; then
echo "$str1等于$str2"
else
echo "$str1不等于$str2"
fi
此代码判断str1
和str2
两个字符串是否相等。
- !=:检查两个字符串是否不相等。
#!/bin/bash
str1="world"
str2="hello"
if [ $str1 != $str2 ]; then
echo "$str1不等于$str2"
else
echo "$str1等于$str2"
fi
用于判断str1
和str2
是否不相等。
- -z:检查字符串是否为空(长度为0)。
#!/bin/bash
str=""
if [ -z $str ]; then
echo "字符串为空"
else
echo "字符串不为空"
fi
该脚本判断str
字符串是否为空。
- -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
是要匹配的变量,pattern1
、pattern2
等是匹配模式,commands1
、commands2
等是匹配成功后要执行的命令,;;
表示命令块的结束,*
是默认匹配模式。
示例
#!/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))
计算a
和b
的和并赋值给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条件语句与分支结构的深入学习,我们可以编写出更加灵活、智能的脚本,满足各种不同的业务需求。无论是简单的文件属性判断,还是复杂的多层条件嵌套逻辑,都能够通过合理运用这些知识来实现。在实际编程中,不断练习和实践这些技巧,将有助于提升我们的脚本编程能力。