SH linux:语法错误:word意外

SH linux:语法错误:word意外,linux,bash,ubuntu,ubuntu-14.04,sh,Linux,Bash,Ubuntu,Ubuntu 14.04,Sh,我想知道我在这段代码中做错了什么: #!/bin/sh SERVICE_NAME=neocloud PATH_TO_JAR=/etc/neocloud/cloud.jar PID_PATH_NAME=/tmp/neocloud-pid case $1 in start) echo "Starting $SERVICE_NAME ..." if [ ! -f $PID_PATH_NAME ]; then nohup java -jar

我想知道我在这段代码中做错了什么:

#!/bin/sh
SERVICE_NAME=neocloud
PATH_TO_JAR=/etc/neocloud/cloud.jar
PID_PATH_NAME=/tmp/neocloud-pid
case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
    ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stoping ..."
            kill $PID;
            echo "$SERVICE_NAME stopped ..."
            rm $PID_PATH_NAME
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    restart)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stopping ...";
            kill $PID;
            echo "$SERVICE_NAME stopped ...";
            rm $PID_PATH_NAME
            echo "$SERVICE_NAME starting ..."
            nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
esac 
通过
sh
执行时,我收到以下错误消息:

语法错误:单词意外(应为“in”)

但是在
case
命令中,我在单词中有

有人知道如何修复这个bug吗

非常感谢

你试过了吗


如本文所述,您的代码在语法上是有效的POSIX类shell代码,您可以在进行验证(但是,这将警告您由于不重复引用变量引用而可能产生的不必要的副作用(例如,
echo$PID_PATH_NAME
而不是
echo“$PID_PATH_NAME”
),但不适用于
案例中的
$1
语句[1] )

类似地,复制问题中的代码并将其粘贴到新文件中,然后在Ubuntu(即Dash)上使用
sh
执行它,效果也很好

因此-除非您的
sh
不是它应该是的-我怀疑您的shell文件中有“奇怪”字符,例如标准ASCII范围之外的Unicode空格,它可能看起来像普通空格,但不是;Unicode无空格字符(
U_00A0
,UTF8编码为
0xC2 0xA0
)就是一个例子

要查找此类字符,请运行以下命令(其中
script
表示脚本):

并在输出中查找
M-
^
序列;例如,前面提到的无中断空间显示为
M-BM-


[1] 双重引用
案例中给出的论点
没有坏处,但不是必需的

虽然在POSIX类shell中,未引用的参数/变量引用是单词分割和路径名扩展的,但是
case
是一个奇怪的例外

以下内容演示了这一点,并适用于所有主要的POSIX类shell(
dash
bash
ksh
zsh
):

文本参数
foo*
大小写
分支匹配,即使
$1
未被引用。

(与典型情况(例如,
echo$1
)相比,
$1
的值将同时受到分词和路径名扩展(globbing)的影响。

$1
的值是什么?$1是第一个命令行参数。如果将来减少到,这会产生错误吗,试着遵守上的指导原则——代码样本应该是最小的,包含的代码数量应该是最小的,能够重现相同的问题,并且是可验证的——这意味着你应该复制并粘贴它,使其脱离你的问题,试着运行它,并确保这仍然会导致错误(会捕获隐藏字符之类的东西),理想情况下,在这里提出问题之前,应该先修复由发现的bug。这不是向字符串转换。这叫做引用。不过,对于整数变量,这实际上可以用作转换为字符串。但是case语句无论如何都会将其解释为字符串。无论如何,这可能是脚本中的问题。请参阅我的注释以获得解释。在
case
语句中,在该位置不需要引用,因为它不容易出现字符串拆分或全局扩展。
case "$1" in
...
LC_ALL=C cat -e script
$ sh -c 'case $1 in "foo *") echo "match";; *) echo "nomatch"; esac' - 'foo *'
match