Shell脚本 - 检查语法

5
如何在不执行ksh shell脚本的情况下检查其语法的正确性?为了更清晰地说明我的观点:在perl中,我们可以执行命令:
perl -c test_script.pl

想要检查语法,ksh有类似的工具吗?

3个回答

4

ksh -n

大多数Borne Shell家族都支持-n选项,包括tcsh。


似乎没有起作用。我执行了"ksh -n test.sh",但它没有列出在test.sh中存在的语法错误。 - sachin
是的,它可以工作。我确信没有语法错误。如果您向我们展示脚本,我们可以分析您寻找语法错误的期望是否正确。 - Jens
1
然后尝试使用sh -n script。 它应该有效。 但是,如果您的语法错误在无效的命令名称中,那么只有在运行时才会被捕获。 sh -n仅检查实际的shell语法。 - tripleee
有些错误只会在运行时出现,甚至是语法错误。问题在于,每次执行一行代码时,shell 都会重新解析该行代码...这是经典的“解释器”行为。因此,如果任何元字符(' " $,通常是!...)出现在变量中并被用于该行代码中,则这些字符可能会对后期解析产生不利影响。第一道防线是引用每个 $ 变量,并且如果读取 $*,则理解并使用备用的 "$@" 表示法(带双引号)。 - Gilbert
Jens:是的,-n 没有捕捉到语法错误,比如我把 echo 改成了 eco,但 sh -n 没有报告任何语法错误。 - AdOracle

1
您所说的未能检测出语法错误的测试实际上并不是语法错误... echo是一个命令(虽然是内置的,但仍然是一个命令),因此ksh/bash不会检查您的命令的拼写/语法。 同样,"["实际上是test命令的别名,命令期望作为其语法的一部分的是闭合方括号"]",而不是ksh/bash的。 因此,-n就像罐子上写的那样,您只是没有正确阅读罐子! :-)

1
我用以下代码进行了一个小测试:

#!/bin/bash
if [ -f "buggyScript.sh" ; then
    echo "found this buggy script"
fi

请注意if语句中缺少的]。现在我输入了。
bash -n buggyScript.sh

缺失的]未被检测到。

第二个测试脚本如下:

#!/bin/bash
if [ -f "buggyScript.sh" ]; then
    echo "found this buggy script"

请注意if结尾处缺少fi。使用以下内容进行测试。
bash -n buggyScript.sh

返回
buggyScript.sh: line 5: syntax error: unexpected end of file

结论: 使用-n选项测试脚本可以检测出一些错误,但并非全部。因此,我认为只有在执行脚本时才能发现所有错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接