Bash - 条件结构 if 和 case¶
目标: 在本章中,您将学习如何
使用条件语法
if
; 使用条件语法
case
;
linux, 脚本, bash, 条件结构
知识:
复杂度:
阅读时间: 20 分钟
条件结构¶
如果 $?
变量用于了解测试或命令执行的结果,它只能显示而不会影响脚本的执行。
但是我们可以在条件中使用它。如果测试通过则执行此操作否则执行此操作。
条件替代 if
的语法
if command
then
command if $?=0
else
command if $?!=0
fi
if
后面的命令可以是任何命令,因为它是它的返回代码 ($?
) 将被评估。通常使用 test
命令来定义多个操作,具体取决于此测试的结果(文件是否存在、变量不为空、写入权限已设置)。
使用经典命令 (mkdir
、tar
等) 允许您在成功的情况下定义要执行的操作,或在失败的情况下显示的错误消息。
示例
if [[ -e /etc/passwd ]]
then
echo "The file exists"
else
echo "The file does not exist"
fi
if mkdir rep
then
cd rep
fi
如果 else
块以新的 if
结构开头,您可以将 else
和 if
合并为 elif
,如下所示
[...]
else
if [[ -e /etc/ ]]
[...]
[...]
# is equivalent to
elif [[ -e /etc ]]
[...]
总结
结构 if
/ then
/ else
/ fi
评估 if
后面的命令
- 如果此命令的返回代码为
0
(true
),则 shell 将执行then
后面的命令; - 如果返回代码与
0
不同 (false
),则 shell 将执行else
后面的命令。
else
块是可选的。
通常需要仅在命令的评估为真时执行一些操作,而在为假时不执行任何操作。
fi
关键字关闭结构。
如果 then
块中只有一个命令要执行,可以使用更简单的语法。
如果 $?
为 true
,则要执行的命令放在 &&
后面,而如果 $?
为 false
,则要执行的命令放在 ||
后面(可选)。
示例
[[ -e /etc/passwd ]] && echo "The file exists" || echo "The file does not exist"
mkdir dir && echo "The directory is created".
也可以使用比 if
更轻的结构来评估和替换变量。
此语法实现了大括号
如果变量为空,则显示替换值
${variable:-value}
如果变量不为空,则显示替换值
${variable:+value}
如果变量为空,则为变量分配一个新值
${variable:=value}
示例
name=""
echo ${name:-linux}
linux
echo $name
echo ${name:=linux}
linux
echo $name
linux
echo ${name:+tux}
tux
echo $name
linux
提示
在决定使用 if
、then
、else
、fi
还是使用前面描述的更简单的语法示例时,请牢记脚本的可读性。如果只有您自己使用脚本,那么您可以使用最适合您的方法。如果其他人可能需要查看、调试或跟踪您创建的脚本,那么使用更具自我说明性的形式 (if
、then
等) 或确保您对脚本进行了充分的文档记录,以便那些可能需要修改和使用脚本的人能够真正理解更简单的语法。如前几节课中多次提到的,对脚本进行文档记录始终是一件好事。
条件替代: 结构 case
¶
一系列 if
结构可能很快变得繁重且复杂。当涉及到相同变量的评估时,可以使用具有多个分支的条件结构。变量的值可以是指定的,也可以属于一组可能性。
可以使用通配符.
结构 case ... in
/ esac
评估 case
后面的变量,并将其与定义的值进行比较。
在找到第一个相等的值时,将执行 )
和 ;;
之间的命令。
评估的变量和提出的值可以是字符串,也可以是命令子执行的结果。
放置在结构末尾,*
选择指示对所有未经过先前测试的值执行的操作。
条件替代案例的语法
case $variable in
value1)
commands if $variable = value1
;;
value2)
commands if $variable = value2
;;
[..]
*)
commands for all values of $variable != of value1 and value2
;;
esac
当值发生变化时,建议使用通配符 []
来指定可能性
[Yy][Ee][Ss])
echo "yes"
;;
|
字符还允许您指定一个值或另一个值
"yes" | "YES")
echo "yes"
;;
作者: Antoine Le Morvan
贡献者: Steven Spencer, Ganna Zhyrnova