shell 中嵌套 if else 语句

shell 中嵌套 if else 语句

我无法理解下面的 if else 语句出了什么问题。

if [ "$technology" == "AN_EUD" ] then
        if [ "$temporal_unit" == "15min" ] && [ "$regional_unit" == "node" ]
        then
                parm="DEVICEID"
        elif [ "$temporal_unit" == "15min" ] && [ "$regional_unit" == "trunk" ]
        then
                parm="DEVICEID"
        else echo "Unkown parameter"
        fi
else [ "$technology" == "IP" ] then
        if [ "$temporal_unit" == "15min" ] && [ "$regional_unit" == "item" ]
        then
                parm="ME_NAME"
        elif [ "$temporal_unit" == "min" ] && [ "$regional_unit" == "item" ]
        then
                parm="DEST"
        else echo "Unknown parameter"
        fi
fi

不断低于错误

my.sh: line 67: syntax error near unexpected token `else'
my.sh: line 67: ` else [ "$technology" == "IP" ] then'

答案1

if [ "$technology" == "AN_EUD" ] then
                                ^

你那里缺少一个分号。它的编写方式then只是[命令的常规参数,而不是 shell 关键字。 (同样,它不是命令中的关键字echo if then else fi。)

Bash 抱怨后者else是一个意外的标记,因为它仍在寻找then,并且由于else位于命令的开头,因此它被识别为关键字。但它不符合语法。

Shellcheck.net还注意到,它说“在‘then’之前使用分号或换行(或引用以使其字面意思)。”

修复之后就是这样的:

else [ "$technology" == "IP" ] then

那应该是,elif但又不是else。如果 之前没有分号then,就 shell 语法而言,这实际上很好,该[ "$technology" == "IP" ] then 命令只是 else 块的一部分。该测试将不起作用,因为[期望看到]最后一个参数,但块的其余部分已执行。如果添加分号,但保持else原样,则应该收到“意外关键字”错误then

测试中的另一个问题是,虽然可以==在 Bash 和 ksh 中工作,但它不是标准的。标准比较运算符[ .. ]=

(注意,我没有看你实际在做什么,只是看语法和错误。)

答案2

@ilkkachu 已经详细说明了您的代码的问题,我只是指出,您可以通过声明使其更加简洁case。在这里,三个变量只是连接在一起,并且字符串与已知情况匹配:

case "$technology:$temporal_unit:$regional_unit" in
  (AN_EUD:15min:node | AN_EUD:15min:trunk)
    parm=DEVICEID;;
  (IP:15min:item)
    parm=ME_NAME;;
  (IP:min:item)
    parm=DEST;;
  (*)
    echo >&2 Unknown parameter;;
esac

由于模式是固定的,变量中的任何冒号都不能与用作分隔符的冒号混合。

if请注意,与基于/ 的语句的一个区别是,如果不是or ,fi也会输出错误。如果这不是您想要的,您可能需要调整代码。$technologyIPAN_EUD

相关内容