Bash if...else 语句
本教程将指导你学习Bash if
语句的基本知识,并向你展示如何在你的shell脚本中使用它。
决策是计算机编程中最基本的概念之一。像其他编程语言一样,Bash中的if
、if..else
、if..elif..else
和嵌套的if
语句被用来根据某个条件执行代码。
if
语句
Bash if
条件句可以有不同的形式。最基本的if
语句有如下形式:
if TEST-COMMAND
then
STATEMENTS
fi
if
语句以if
关键字开始,后面是条件表达式和then
关键字。语句以fi
关键字结束。
如果TEST-COMMAND
的值是True
,则STATEMENTS
被执行。如果TEST-COMMAND
返回False
,什么也不会发生,STATEMENTS
被忽略。
一般来说,缩进你的代码和用空行分隔代码块是一个好的做法。大多数人选择使用4空格或2空格缩进。缩进和空行使你的代码更容易阅读和组织。
让我们看一下下面的例子脚本,它检查一个给定的数字是否大于10:
#!/bin/bash
echo -n "Enter a number: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "The variable is greater than 10."
fi
将代码保存在一个文件中,并从命令行中运行它:
bash test.sh
脚本会提示你输入一个数字。例如,如果你输入了15,test
命令将被评估为true
,因为15大于10,而then
子句中的echo
命令将被执行。
输出
The variable is greater than 10.
if..else
陈述
Bash if..else
语句的形式如下:
if TEST-COMMAND
then
STATEMENTS1
else
STATEMENTS2
fi
如果TEST-COMMAND
的评估结果为True
,则STATEMENTS1
将被执行。否则,如果TEST-COMMAND
返回False
,STATEMENTS2
将被执行。在语句中,你只能有一个else
子。
让我们在前面的示例脚本中添加一个else
子句:
#!/bin/bash
echo -n "Enter a number: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "The variable is greater than 10."
else
echo "The variable is equal or less than 10."
fi
如果你运行该代码并输入一个数字,该脚本将根据该数字是大于还是小于/等于10而打印出不同的信息。
if..elif..else
语句
Bash if..elif..else
语句的形式如下:
if TEST-COMMAND1
then
STATEMENTS1
elif TEST-COMMAND2
then
STATEMENTS2
else
STATEMENTS3
fi
如果TEST-COMMAND1
评估为True
,STATEMENTS1
将被执行。如果TEST-COMMAND2
评估为True
,STATEMENTS2
将被执行。如果没有一个测试命令评估为True
,则STATEMENTS3
将被执行。
语句中可以有一个或多个elif
子句。else
子句是可选的。
这些条件是按顺序评估的。一旦一个条件返回True
,其余的条件就不会被执行,程序控制就会转移到if
语句的末尾。
让我们在前面的脚本中添加一个elif
子句:
#!/bin/bash
echo -n "Enter a number: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "The variable is greater than 10."
elif [[ $VAR -eq 10 ]]
then
echo "The variable is equal to 10."
else
echo "The variable is less than 10."
fi
嵌套的if
语句
Bash允许你在if
语句中嵌套if
语句。你可以将多个if
语句放在另一个if
语句中。
下面的脚本将提示你输入三个数字,并打印这三个数字中最大的一个数字。
#!/bin/bash
echo -n "Enter the first number: "
read VAR1
echo -n "Enter the second number: "
read VAR2
echo -n "Enter the third number: "
read VAR3
if [[ $VAR1 -ge $VAR2 ]]
then
if [[ $VAR1 -ge $VAR3 ]]
then
echo "$VAR1 is the largest number."
else
echo "$VAR3 is the largest number."
fi
else
if [[ $VAR2 -ge $VAR3 ]]
then
echo "$VAR2 is the largest number."
else
echo "$VAR3 is the largest number."
fi
fi
下面是输出结果的样子:
输出
Enter the first number: 4
Enter the second number: 7
Enter the third number: 2
7 is the largest number.
一般来说,使用
case
语句而不是嵌套的if
语句会更有效率。
多种条件
逻辑上的OR
和AND
运算符允许你在if
语句中使用多个条件。
下面是另一个版本的脚本,用于打印三个数字中最大的数字。在这个版本中,我们没有使用嵌套的if
语句,而是使用逻辑的AND
(&&
)运算符。
#!/bin/bash
echo -n "Enter the first number: "
read VAR1
echo -n "Enter the second number: "
read VAR2
echo -n "Enter the third number: "
read VAR3
if [[ $VAR1 -ge $VAR2 ]] && [[ $VAR1 -ge $VAR3 ]]
then
echo "$VAR1 is the largest number."
elif [[ $VAR2 -ge $VAR1 ]] && [[ $VAR2 -ge $VAR3 ]]
then
echo "$VAR2 is the largest number."
else
echo "$VAR3 is the largest number."
fi
test 命令
在Bash中,test
命令采用以下语法形式之一:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
为了使脚本具有可移植性,最好使用旧的测试[
命令,它在所有的POSIX shell上都可以使用。新的升级版的test
命令[[
(双括号)在大多数使用Bash、Zsh和Ksh作为默认shell的现代系统上都支持。
要否定测试表达式,请使用逻辑NOT
(!
)运算符。当比较字符串时,总是使用单引号或双引号,以避免单词分割和通配符问题。
下面是一些最常用的运算符:
-n
VAR
- 如果VAR
的长度大于0,则为真。-z
VAR
- 如果VAR
是空的,则为真。STRING1 = STRING2
- 如果STRING1
和STRING2
相等,则为真。STRING1 != STRING2
- 如果STRING1
和STRING2
不相等,则为真。INTEGER1 -eq INTEGER2
- 如果INTEGER1
和INTEGER2
相等,则为真。INTEGER1 -gt INTEGER2
- 如果INTEGER1
大于INTEGER2
,则为真。INTEGER1 -lt INTEGER2
- 如果INTEGER1
小于INTEGER2
,则为真。INTEGER1 -ge INTEGER2
- 如果INTEGER1
等于或大于INTEGER2,则为真。INTEGER1 -le INTEGER2
- 如果INTEGER1
等于或小于INTEGER2
,则为真。-h
FILE
- 如果FILE
存在,并且是一个符号链接,则为真。-r
FILE
- 如果FILE
存在并且可读,则为真。-w
FILE
- 如果FILE
存在并且可以写入,则为真。-x
FILE
- 如果FILE
存在并且可以执行,则为真。-d
FILE
- 如果FILE
存在,并且是一个目录,则为真。-e
FILE
- 如果FILE
存在并且是一个文件,则为真,无论其类型如何(节点、目录、套接字等)。-f
FILE
- True 如果FILE
存在并且是一个普通的文件(不是一个目录或设备)。
总结
if
, if..else
和 if..elif..else
语句允许你通过评估给定的条件来控制Bash脚本的执行流程。
如果你有任何问题或反馈意见,请随时留言。