跳至内容

Bash - 条件结构 if 和 case


目标: 在本章中,您将学习如何

✔ 使用条件语法 if;
✔ 使用条件语法 case;

🏁 linux, 脚本, bash, 条件结构

知识: ⭐ ⭐
复杂度: ⭐ ⭐ ⭐

阅读时间: 20 分钟


条件结构

如果 $? 变量用于了解测试或命令执行的结果,它只能显示而不会影响脚本的执行。

但是我们可以在条件中使用它。如果测试通过执行此操作否则执行此操作。

条件替代 if 的语法

if command
then
    command if $?=0
else
    command if $?!=0
fi

if 后面的命令可以是任何命令,因为它是它的返回代码 ($?) 将被评估。通常使用 test 命令来定义多个操作,具体取决于此测试的结果(文件是否存在、变量不为空、写入权限已设置)。

使用经典命令 (mkdirtar 等) 允许您在成功的情况下定义要执行的操作,或在失败的情况下显示的错误消息。

示例

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 结构开头,您可以将 elseif 合并为 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

提示

在决定使用 ifthenelsefi 还是使用前面描述的更简单的语法示例时,请牢记脚本的可读性。如果只有您自己使用脚本,那么您可以使用最适合您的方法。如果其他人可能需要查看、调试或跟踪您创建的脚本,那么使用更具自我说明性的形式 (ifthen 等) 或确保您对脚本进行了充分的文档记录,以便那些可能需要修改和使用脚本的人能够真正理解更简单的语法。如前几节课中多次提到的,对脚本进行文档记录始终是一件好事。

条件替代: 结构 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