在bash脚本中\(意味着什么?)



我正在编辑别人的.sh,我遇到了这条线

if [ "$ACTION" = "install" -o ( "$ACTION" = "start" -a -z "$APPS" ) ]

我的理解:

  • "$ACTION" = "install"正在检查脚本的操作是否为安装
  • -o是OR运算符
  • "$ACTION" = "start"正在检查脚本是否正在启动另一个程序
  • -a是AND运算符
  • -z "$APPS"正在检查$APPS是否为空字符串

我不知道( "$ACTION" = "start" -a -z "$APPS" )是什么意思。反斜杠括号(( <action> ))是开始/结束注释吗?我看了看,这不是我所期望的正常条件分组。

编辑:为了帮助表达我的想法,这在大多数其他编程语言中都是等效的。因为我对bash还很陌生,所以开放式||对我来说并不奇怪

if (ACTION == 'install' || /* ACTION == 'start' && APPS == '' */)

(转义字符(,因此外壳不会将其视为语法,而是将其作为参数传递给test(也称为[)。使用'('"("也可以达到同样的效果。

请注意,在针对test的POSIX标准中,使用括号进行分组(以及每个test调用执行一个以上测试操作的所有其他情况——也就是-a-o)被标记为过时,不应在新代码中使用(请参阅标准文档中的OB标记)。

写这篇文章的更好方法是:

if [ "$ACTION" = "install" ] || { [ "$ACTION" = "start" ] && [ -z "$APPS" ]; }; then

或者,使用[[(一个提供解析器支持的ksh和bash扩展,使大多数位置不需要引号,并允许()作为测试操作的一部分进行解析,而不需要转义):

if [[ $ACTION = install || ( $ACTION = start && -z $APPS ) ]]; then

最新更新