语法错误:“(”意外(期待“fi”)

时间:2013-11-22 03:32:54

标签: linux shell

错误讯息:

Syntax error: "(" unexpected (expecting "fi")
/sbin/modprobe.sh: 2: /sbin/modprobe.sh: EOF: not found
/sbin/modprobe.sh: 10: /sbin/modprobe.sh: Syntax error: "(" unexpected (expecting "fi")

Shell脚本:

EOF
#!/bin/bash

if [[ \$1 == -l ]]
then

if [ -z \$2 ]    
then
find /lib/modules/\$(uname -r) -name '*.ko' | sed -e "s#\\/lib\/modules\/\$(uname -r)\/##g"
else
find /lib/modules/\$(uname -r) -name '*.ko' | sed -e "s#\/lib\/modules\/\$(uname -r)\/##g" | grep \$2
fi

else
/sbin/modprobe \$@
fi
EOF

1 个答案:

答案 0 :(得分:1)

这是你的脚本,重写为工作。

#!/bin/bash

if [ x$1 = x-l ] ; then

    BASE=/lib/modules/$(uname -r)/

    if [ x$2 = x ] ; then
        find $BASE -name '*.ko' | sed -e "s#$BASE##g"
    else
        find $BASE -name '*.ko' | sed -e "s#$BASE##g" | grep $2
    fi

else
    /sbin/modprobe $@
fi

你的主要问题是大量的反斜杠打破了剧本。如果您使用$(command)来获取命令的输出,则需要保留该美元符号; \$(command)将变成文字字符串"$(command)",这不是您想要的。同样,您的sed命令行使用#字符来分隔搜索和替换字符串,因此您不需要在路径中的斜杠之前添加反斜杠。同样,您需要为第二个参数设置$2; \$2是文字字符串"$2"

我使用了一个通用约定来测试$1$2参数:我在测试中放了一个x。这甚至可以在旧的古怪的UNIX shell中运行。我想在Linux上使用GNU Bash你可以依靠内置的[运算符,但这样做仍然有用。

另请注意我如何缩进if / else语句。这纯粹是一种风格的东西,你不必按照我的方式做事,但我觉得这是最具可读性的。

最后,这个脚本接近复杂程度,我会考虑用比Bash更强大的语言重写它。我个人更喜欢Python,但你可以使用Ruby或任何你喜欢的东西。