Bash条件语句if-else实战
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
,因为a
和b
的值相等,-eq
比较结果为真。
字符串比较
字符串比较也有一系列操作符:
=
:字符串相等!=
:字符串不相等-z
:字符串长度为0-n
:字符串长度不为0
下面是判断两个字符串是否相等的例子:
#!/bin/bash
str1="hello"
str2="world"
if [ $str1 = $str2 ]; then
echo "$str1 和 $str2 相等"
else
echo "$str1 和 $str2 不相等"
fi
显然hello
和world
不相等,所以会输出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
在这个脚本中,我们首先通过top
和free
命令获取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
是指在一个if
或else
分支内再包含另一个if - else
语句。其基本结构如下:
if [ condition1 ]; then
if [ condition2 ]; then
commands1
else
commands2
fi
else
commands3
fi
首先判断condition1
,如果为真,再判断condition2
,根据condition2
的结果执行commands1
或commands2
;如果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
语句有了更全面的认识。在实际的脚本编写中,根据具体需求合理运用这些知识,能够编写出功能强大且健壮的脚本。