一. 概述
在上一篇里讲到了 shell 脚本, shell 按照命令在脚本中出现的顺序依次进行处理, 对于顺序操作已经足够了, 但许多程序要求对 shell 脚本中的命令加入一些逻辑流程控制, 这样的命令通常叫做 结构化命令.
1.1 使用 if - then 语句
-- 最基本的结构化就是 if -then 语句, 格式如下:
- if command
- then
- commands
- fi
在其他编程语言中, if 是一个等式, 值结果为 ture 或 false, 但在 bash shell 的 if 语句并不是这样. 在 bash shell 的 if 语句会运行 if 后面的那个命令, 如果该命令的退出状态码是 0, 位于 then 部分的命令就会被执行. 反之则不执行, 继续执行脚本中的下一个命令. fi 语句用来表示 if -then 语句到此结束. 下面是一个 if -then 简单例子如下:
上面脚本在 if 行采用了 pwd 命令, 命令成功结束, echo 语句显示了文本字符串.
使用 if 执行多个命令时, bash shell 会将这些命令当成一个块, 如果 if 语句行的命令退出状态值为 0, 所有命令都会被执行, 如果 if 语句行的命令的退出状态不为 0, 所有的命令都会被跳过. 下面一个案例 if 涉及到了两个命令一个是 grep $testuser, 另一个是显示路径 / etc/passwd. 上图示例中 MySQL 用户存在, 报以退出状态码是 0. 并显示了 echo 信息.
下面演示如果 testuser 变量设置成一个系统上不存在的用户, 状态码则不是返回 0, 不进入 if then 中, 什么都不会显示.
1.2 if-then-else 语句
如果 if 执行命令返回一个非零退出状态码, bash shell 会继续执行脚本中的下一条命令, 这时 else 语句提供了作用, 格式如下:
-- if -then -else 格式:
- if command
- then
- commands
- else
- commands
- fi
下面示例, 在原有脚本上加入 else 语句块, 最后显示了 else 中的信息.
1.3 嵌套 if
嵌套的 if -then 语句位于主 if -then-else 语句的 else 代码块中. 如下所示在 else 语句块中再嵌入 if-then-else
对于 else 部分的另一种形式是: elif, 这样就不用再写多个 if-then 语句了, elif 是另一个 if-then 语句延续 else 部分, 这种比上面的 if 嵌套可读性强, 同样把上面的脚本改一下, 示例如下, if 命令退出状态码不为 0, 进入到 elif 语句块中.
对于 elif 后面还可以加 else 语句块 , 当 elif 命令返回也不为 0 时, 进入最后的 else 语句块, 如下图所示:
对于 elif 语句 还可以是多个串起来. 这里就不再演示, 语法如下:
- if command1
- then
- command set 1
- elif command2
- then
- ...
- elif command3
- then
- ...
- else
- ...
- fi
对于上面的 if 结构化语句, 归纳起来如下面四种格式, 类似于其它编辑语言的 if ..else 或 if ..else if.. else.
- if-then
- if-then else
- if-then elif-then else
- if-then elif-then elif-then else
1.4 结构化 test 命令
上面的 if 命令只能测试普通的 shell 命令的状态码, 下面介绍 test 命令, 它能测试不同条件, 条件成立同样是退出状态码为 0, 如果条件不成立测返回非 0 状态码.
-- test 命令格式如下
- if test condition
- then
- commands
- fi
下面是使用 test 命令确定变量中是否有内容, 下面的 testuser 变量值为 MySQL, 因此 test 命令返回状态码为 0, 进入了 then 语句块中. 示例如下:
下面演示变量没有值的情况下, test 命令返回状态码不为 0, 进入了 else 语句块中.
在 bash shell 中提供了另一种条件测试方法, 无需在 if -then 语句中声明 test 命令, 使用 [condition] 这种应该是日常使用比较频繁的. 这种代替 test 的用法在下一篇中在详细解说.
-- 格式如下:
- if [condition]
- then
- commands
- fi
来源: https://www.cnblogs.com/MrHSR/p/9777246.html