我下面的这个(POSIX)shell代码片段可能存在语法错误:
#!/bin/sh
if tput setaf >/dev/null 2>&1; then tput_init_linux else tput_init_none;
elif tput AF >/dev/null 2>&1; then tput_init_bsd else tput_init_none;
else tput_init_none; fi
ShellCheck 0.10.0 没有指出任何问题,我基本上是偶然发现它的。
我按照以下方式进行了测试:
if tput setaf >/dev/null 2>&1; then tput_init_linux else tput_init_none; fi
这个运行正常:
tput_init_linux: command not found
使用
!
反转逻辑:if ! tput setaf >/dev/null 2>&1; then tput_init_linux else tput_init_none; fi
没有输出任何内容,但如果我添加一个分号:
if ! tput setaf >/dev/null 2>&1; then tput_init_linux; else tput_init_none; fi
它看起来按预期工作:
tput_init_none: command not found
但我似乎无法在之后串联这些多个if
语句。
所以如你所见,我达到了一个状态,一个语句可以工作,但串联起来似乎有问题。有人能帮忙吗?
你的代码中有两个语法错误。首先,需要使用分号或换行符。这是错误的1:
但这样是正确的:
或者
其次,
if/elif/else/fi
结构由if
开始,由else
后跟fi
结束。elif
只能放在中间,你可以有多个elif
,但只能有一个else
。所以你尝试的写法是令人困惑的:因为每个if/else对是二元的,我不确定你如何将它们串联起来。现在,我认为你想要做的是在
tput setaf
和tput AF
都不工作时,只运行tput_init_none
。如果是这样,你会这样做:或者,同样的事情:
基本上,你可以串联任意多的
if/elif
,但只能有一个else
。else
是最终的,后备条件,如果if
和所有的elif
都失败,就会执行它。1更准确地说,这只是一个“语法错误”,在这个意义上,这种语法不会做你想要它做的事情。它实际上是完全有效的语法,但它的意思是“用参数
else
和command2
运行命令command1
。由于这实际上是有效的语法,shellcheck不会检测到它,但它不会做你期望的事情:所以你可以把它想象成
if true; then echo "TRUE" "else" "echo" "FALSE"; fi
。