调试语法错误:“}”意外(期望“fi”)

Dis*_*oat 6 shell-script services

我刚刚.deb在 Ubuntu 服务器上安装(从提供的文件)的某个软件的服务将无法启动。运行服务时出现错误:

/etc/init.d/matrixsa: 44: Syntax error: "}" unexpected (expecting "fi")
Run Code Online (Sandbox Code Playgroud)

这是脚本的相关部分。不精通 shell 脚本我不知道这是否有效:

if [ -f /etc/rc.d/init.d/functions ]
then
    . /etc/rc.d/init.d/functions
else
    function action {
        echo "$1"
        shift
        $@
    } # <-- this is line 44
    function success {
        echo -n "Success"
    }
    function failure {
        echo -n "Failed"
    }
fi
Run Code Online (Sandbox Code Playgroud)

Chr*_*own 13

$@可以包含任何内容,甚至是使您的函数突然在语法上无效的内容。而是引用它。这是脚本的一个不易损坏的版本:

if [ -f /etc/rc.d/init.d/functions ]; then
    . /etc/rc.d/init.d/functions
else
    action() {
        printf '%s\n' "$1"
        shift
        "$@"
    }
    success() { printf Success ; }
    failure() { printf Failed ; }
fi
Run Code Online (Sandbox Code Playgroud)

如果您正在使用bash或类似,您可以使用以下作为action函数:

action() {
    printf '%s\n' "$1"
    "${@:2}"
}
Run Code Online (Sandbox Code Playgroud)

如果它像原始脚本一样在 IFS 上拆分很重要(可能不是),请取消引用$@

您也可能在非 bash shell 中运行它。function是一种bashism,请func()改用。

  • +1,`"$@"` 可能具有所有 Bash 习语中最大的效用/使用因素。使用更多报价 :) (2认同)