我无法理解下面的 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
也会输出错误。如果这不是您想要的,您可能需要调整代码。$technology
IP
AN_EUD