写点什么

Shell 分支语句

作者:圆弧
  • 2023-02-12
    广东
  • 本文字数:1263 字

    阅读完需:约 4 分钟

Shell 分支语句

首先我们需要先看下,什么是 true 和 false

true 和 false

shell 中 ture 和 false 都是一个可执行程序,ture 是 0,false 是非 0,这和其他程序语言不一致。但带来一个好处是,我们可以返回 1 ~ 255 个不同的错误码表示不同的错误。


shell 中 ture 也可以用:来表示,优点是使用:不会调用一个二进制程序,效率更高,这种用法常用在 while 中。


whereis truetrue; echo $?
whereis falsefalse; echo $?
# 这种用法常用在while中while :; do echo $? breakdone
复制代码

示例及输出

zyh@DESKTOP-70600416:~$ whereis truetrue: /usr/bin/true /usr/share/man/man1/true.1.gzzyh@DESKTOP-70600416:~$ true; echo $?0
zyh@DESKTOP-70600416:~$ whereis falsefalse: /usr/bin/false /usr/share/man/man1/false.1.gzzyh@DESKTOP-70600416:~$ false; echo $?1
zyh@DESKTOP-70600416:~$ while :; do echo $?; break ;done0
复制代码

if 语句

if 在命令返回 true 时,执行对应分支下的命令。


# 用法1if test -d /;then echo "dir"fi
# 用法2if test -f /;then echo "file"elif test -d /;then echo "dir"fi
# 用法3if test -f /;then echo "file"elif test ! -d /;then echo "not dir"else echo "default"fi
复制代码

示例及输出

zyh@DESKTOP-70600416:~$ if test -d /;then  echo "dir"; fidir
zyh@DESKTOP-70600416:~$ if test -f /;then echo "file"; elif test -d /;then echo "dir"; fidir
zyh@DESKTOP-70600416:~$ if test -f /;then echo "file"; elif test ! -d /;then echo "not dir"; else echo "default"; fidefault
复制代码

test 命令

test 和 ([]) 在用途上是一样的,用于判断一个 表达式 返回的结果,推荐使用 test,test 支持的 表达式 可通过查询 man 手册看到。


省略的表达式默认为 false。否则,计算表达式结果并设置退出状态。


man test
复制代码

常用表达式

注意事项

  1. 注意使用 test 比较字符串变量的时候,要使用双引号,避免变量为空。实际上,多数情况下使用字符串变量,都应该加双引号,这是一个好习惯。


zyh@DESKTOP-70600416:~$ data=zyh@DESKTOP-70600416:~$ test "" != $databash: test: : unary operator expected
# 正确实例test "" != "${data}"
复制代码


  1. test 中的 and 可以使用 && 或 -a ,or 可以使用 || 或 -o,但推荐使用 && 和 ||。

case 语句

case 可以用于匹配一个变量是否满足一个 正则表达式,并执行对应的分支,类似 switch。


同时,由于它带来的匹配特性,case 也是一个用于判断字符串前缀后缀的一个方式。

case 支持的 pattern 举例

示例 1 (判断字符串前缀)

#!/bin/bash
# 从上往下执行,一旦匹配则执行分支并退出。这意味这不是最长匹配,也意味着,长的匹配要放前面。var="this is a"case "$var" in this*) echo "this" ;; or\ this\ is*) echo "this is" ;; *) echo "don't know" ;;esac
复制代码

示例 2 (判断字符串后缀)

#!/bin/bash
has_suffix() { var="$1" case "$var" in *a) echo "has suffix a" ;; *b) echo "has suffix b" ;; *) echo "don't know" ;; esac}has_suffix "a"
复制代码


用户头像

圆弧

关注

还未添加个人签名 2023-01-13 加入

还未添加个人简介

评论

发布
暂无评论
Shell分支语句_圆弧_InfoQ写作社区