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