Bash case 语句

case ... esac

介绍

Bash case 语句是具有许多 ELIF 元素的 IF-THEN-ELSE 的最简单形式。使用 case 语句使 bash 脚本更具可读性,并且更易于维护。它通常用于简化具有多种不同选择的复杂条件。 Bash case 语句遵循与 Javascript 或 C 语言中的switch 语句类似的逻辑。但是又略有不同,如下所示:

Bash case 语句只接受一次值,然后多次测试该值。一旦找到模式就执行与其链接的语句,它将停止搜索模式,这与 C switch 语句几乎相反。

语法

bash case 语句的语法如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
case expression in  
    pattern_1)  
        statements  
        ;;  
    pattern_2)  
        statements  
        ;;  
    pattern_3|pattern_4|pattern_5)  
        statements  
        ;;  
    pattern-n)  
        statements  
        ;;  
    *)  
        statements  
        ;;  
esac

bash case 语句的一些重要说明:

  • bash 中的每个 case 语句均以 case 关键字开头,后接 case 表达式和 in 关键字。使用 esac 关键字关闭 case 语句。
  • 可以使用以 | 分隔的多个模式运算符,运算符 ) 表示模式列表的终止。包含语句的模式称为子句,并且必须以双分号(;;)终止。星号(*)用作定义默认情况的最终模式。当用作最后一种情况时,它用作默认情况。
  • 子句中如果使用冒号 : ,表示空命令,不执行任何操作

首先,case 语句扩展表达式并尝试与每个包含的模式匹配。找到匹配项后,将执行所有链接的语句,直到双分号(;;)为止。在第一个匹配项之后,case 以最后执行的语句的退出状态终止。如果没有匹配的模式,则 case 的退出状态为零。否则,返回状态是已执行语句的退出状态。如果使用默认的星号(*)模式,则在没有匹配模式的情况下将执行它。下面通过一些示例来了解这种机制:

示例

使用 case 语句解决执行两次 source /etc/profile 后,$PATH 出现重复数据的问题

1
2
3
4
case ":$PATH:" in
  *":$new_entry:"*) :;; # already there
  *) PATH="$new_entry:$PATH";; # or PATH="$PATH:$new_entry"
esac

参考:
https://www.yiibai.com/bash/bash-case-statement.html
https://www.cnblogs.com/ChinaGo/p/9910747.html
https://unix.stackexchange.com/questions/14895/duplicate-entries-in-path-a-problem

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计