我正在阅读有关shell命令的介绍性书籍,它建议使用管道命令作为OR语句,如下所示:
case "$1" in
start|START)
/usr/bin/sshd
;;
stop|STOP)
kill $(cat/var/run/sshd.pid)
;;
esac
为什么这样做/它背后的逻辑是什么?
答案 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
语句的特殊语法的一部分,用于定义将导致执行以下操作的多个值语句(最多;;
分隔符)。