ped*_*pio 3 linux bash ubuntu sh ubuntu-14.04
我想知道我在这段代码中做错了什么:
#!/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
Run Code Online (Sandbox Code Playgroud)
执行sh我得到以下错误信息:
语法错误:单词意外(期待"in")
但是在case命令中我说了in这个词.
任何人都知道如何解决这个错误?
非常感谢!
如此处所述,您的代码在语法上是有效的POSIX类shell代码,您可以在shellcheck.net上验证(但是,这会警告您由于不引用您的变量引用echo $PID_PATH_NAME而导致潜在的不必要的副作用(例如,而不是echo "$PID_PATH_NAME"),然而这并不适用于$1在case声明中[1]
).
类似地,复制问题中的代码并将其粘贴到新文件中并使用shUbuntu(即Dash)来执行它也可以正常工作.
因此 - 除非你sh不是它应该是什么 - 我怀疑你的shell文件中有"怪异"字符,例如标准ASCII范围之外的Unicode空格,它可能看起来像普通的空格,但不是; Unicode不间断空格字符(U_00A0UTF8编码为0xC2 0xA0)就是一个例子.
要查找此类字符,请运行以下命令(script代表您的脚本):
LC_ALL=C cat -e script
Run Code Online (Sandbox Code Playgroud)
并在输出中查找M-和^<letter>序列; 例如,上述不间断空间显示为M-BM-.
[1] 双重引用该case陈述的论点并没有伤害,但没有必要.
虽然不带引号的参数/变量引用在类似POSIX的shell 中的大多数位置都是分词和路径名扩展的,但这case是一个奇怪的例外.
下面演示了这一点,并与所有主要的POSIX样弹作品(dash,bash,ksh,zsh):
$ sh -c 'case $1 in "foo *") echo "match";; *) echo "nomatch"; esac' - 'foo *'
match
Run Code Online (Sandbox Code Playgroud)
即使不加引号,Literal参数也foo *与case分支匹配.
(将其与典型情况(例如)进行对比,其中值将受到分词和路径名扩展(globbing)的影响.)$1echo $1$1