我可以将管道运算符用作OR语句吗?

时间:2017-01-15 21:51:32

标签: bash shell case glob

我正在阅读有关shell命令的介绍性书籍,它建议使用管道命令作为OR语句,如下所示:

case "$1" in 
  start|START)
    /usr/bin/sshd
    ;;
  stop|STOP)
    kill $(cat/var/run/sshd.pid)
    ;;
esac

为什么这样做/它背后的逻辑是什么?

2 个答案:

答案 0 :(得分:2)

这里不是管道操作员。它在case语法范围内。阅读man bash并转到"复合命令"部分并阅读案例。

以下是bash手册所说内容的摘录

case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
     

首先是case命令   展开 word ,并尝试将其与每个 pattern 匹配   转向,使用与路径名扩展相同的匹配规则(请参阅   下面的路径名扩展)。这个词用波浪号扩展   扩展,参数和变量扩展,算术   替换,命令替换,进程替换和引用   去除。检查的每个 pattern 都使用波浪扩展进行扩展,   参数和变量扩展,算术替换,命令   替代和过程替代。如果是shell选项   启用nocasematch,执行匹配而不考虑   字母字符的情况。当找到匹配时,   执行相应的 list 。如果使用;;运算符,则不   在第一次模式匹配后尝试后续匹配。运用   代替;&的{​​{1}}会导致执行继续使用 ;;   与下一组模式相关联。使用list代替   ;;&导致shell测试语句中的下一个模式列表,   如果有的话,并在成功匹配时执行任何关联的 ;; 。   如果没有模式匹配,则退出状态为零。否则就是了   退出在 list 中执行的最后一个命令的状态。

这是语法

list

哪个是

case "$1" in
start|START)

匹配上面的语法,该语法至少告诉一个模式,或多个由case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac分隔的模式,一个垂直条。

答案 1 :(得分:0)

正如phoxis评论的那样,虽然它与用于管道的字符相同,但在此上下文中,它是case语句的特殊语法的一部分,用于定义将导致执行以下操作的多个值语句(最多;;分隔符)。