shell-奇怪的语法问题(语法正常时出现意外的单词异常)
我目前正在编写服务器启动脚本。一切看起来都很正常,但它不会执行,所以我使用-n标志检查了语法。我给了我一个错误:shell-奇怪的语法问题(语法正常时出现意外的单词异常),shell,unix,Shell,Unix,我目前正在编写服务器启动脚本。一切看起来都很正常,但它不会执行,所以我使用-n标志检查了语法。我给了我一个错误: Syntax error: word unexpected (expecting "in") 这真的很奇怪,因为在正确的地方 这是一行: case $vtyp in 这是全部代码: #!/bin/bash BACKUP_PATH="$HOME/backups" MINECRAFT_PATH="$HOME/server" SCREEN_NAME="brain
Syntax error: word unexpected (expecting "in")
这真的很奇怪,因为在正确的地方
这是一行:
case $vtyp in
这是全部代码:
#!/bin/bash
BACKUP_PATH="$HOME/backups"
MINECRAFT_PATH="$HOME/server"
SCREEN_NAME="brain"
SERVER_JAR="minecraft.jar"
SERVER_JAR_PATH="$MINECRAFT_PATH/$SERVER_JAR"
RAM="Xmx1G";
MESSAGE_BACKUP="Backup wird erstellt..."
MESSAGE_STARTING="Server wird gestartet..."
MESSAGE_ALREADY_STARTED="Server bereits gestartet, wechsle zur Konsole..."
MESSAGE_NOT_STARTED="Fehler, nicht gestartet..."
MESSAGE_UNKNOWN="Unbekanntes Argument $1"
MESSAGE_INVALID_VERSION="Unbekannter Versionstyp."
MESSAGE_VERSIONS="Bitte Version auswählen:
1 = Stable - Stabile Version
2 = Beta - Betaversion
3 = Dev - Entwicklungsversion
"
MESSAGE_VERSION_TYPES="Versionstypen: >>stable<< - Stabile Version >>beta<< - Betaversion >>dev<< - Entwicklungsversion"
URL_JAR_STABLE=""
URL_JAR_BETA=""
URL_JAR_DEV=""
DO_BACKUP()
{
cd $HOME
echo $MESSAGE_BACKUP
mkdir $BACKUP_PATH
date=$(date '+%Y-%m-%d %H-%M-%S')
tar -cjvf "$BACKUP_PATH/Complete Backup $date.tar.bz2" $MINECRAFT_PATH
rm -rf "$MINECRAFT_PATH/server.log backups/*"
}
DO_START()
{
cd $MINECRAFT_PATH
echo $MESSAGE_STARTING
screen -A -m -d -S $SCREEN_NAME java -$RAM -jar $SERVER_JAR_PATH -o true
}
DO_REATTACH()
{
echo $MESSAGE_ALREADY_STARTED
screen -d -r $SCREEN_NAME
}
DO_KILL()
{
if [ screen -list | grep -q $SCREEN_NAME ]
then
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say Server wird gestoppt.\r"`"
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 30\r"`"
sleep 10
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 20\r"`"
sleep 5
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 15\r"`"
sleep 5
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 10\r"`"
sleep 1
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 9\r"`"
sleep 1
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 8\r"`"
sleep 1
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 7\r"`"
sleep 1
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 6\r"`"
sleep 1
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 5\r"`"
sleep 1
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 4\r"`"
sleep 1
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 3\r"`"
sleep 1
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 2\r"`"
sleep 1
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say 1\r"`"
sleep 1
screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop\r"`"
screen -d -r $SCREEN_NAME
else
echo $MESSAGE_NOT_STARTED
fi
}
DO_NORMAL()
{
if [ ! screen -list | grep -q $SCREEN_NAME ]
then
if [ ! -f $SERVER_JAR_PATH ]
then
DO_UPDATE
DO_NORMAL
else
DO_BACKUP
DO_START
fi
else
DO_REATTACH
fi
}
DO_UPDATE()
{
if [ $# -lt 1 ]
then
while [ true ]
do
read -p "$MESSAGE_VERSIONS" vtyp
case $vtyp in
[1]*) DO_UPDATE "stable"; break;;
[2]*) DO_UPDATE "beta"; break;;
[3]*) DO_UPDATE "dev"; break;;
* ) echo $MESSAGE_INVALID_VERSION;;
esac
done
else
if [ $1 = "stable" ]
then
mkdir $MINECRAFT_PATH
wget $URL_JAR_STABLE -O "$SERVER_JAR_PATH"
elif [ $1 = "beta" ]
then
mkdir $MINECRAFT_PATH
wget $URL_JAR_BETA -O "$SERVER_JAR_PATH"
elif [ $1 = "dev" ]
then
mkdir $MINECRAFT_PATH
wget $URL_JAR_DEV -O "$SERVER_JAR_PATH"
else
echo $MESSAGE_INVALID_VERSION
echo $MESSAGE_VERSION_TYPES
fi
fi
}
if [ $# -lt 1 ]
then
DO_NORMAL
else
if [ $1 = "backup" ]
then
if screen -list | grep -q $SCREEN_NAME;
then
DO_KILL
DO_BACKUP
DO_START
else
DO_BACKUP
fi
elif [ $1 = "kill" ]
then
DO_KILL
elif [ $1 = "update" ]
then
DO_KILL
DO_UPDATE $2
else
echo $MESSAGE_UNKNOWN
fi
fi
#/bin/bash
BACKUP_PATH=“$HOME/backups”
MINECRAFT_PATH=“$HOME/server”
SCREEN\u NAME=“brain”
SERVER\u JAR=“minecraft.JAR”
SERVER\u JAR\u PATH=“$MINECRAFT\u PATH/$SERVER\u JAR”
RAM=“Xmx1G”;
MESSAGE\u BACKUP=“BACKUP wird erstellt…”
消息\u STARTING=“服务器wird gestartet…”
消息\u已\u启动=“服务器已启动,wechsle zur Konsole…”
消息\u NOT \u STARTED=“Fehler,nicht gestaret…”
MESSAGE_UNKNOWN=“unbekannets参数$1”
消息\u INVALID\u VERSION=“unbekanner Versionstyp。”
MESSAGE_VERSIONS=“BITE Version auswählen:
1=稳定-稳定版本
2=β-β厌恶
3=开发-Entwicklungsversion
"
MESSAGE\u VERSION\u TYPES=“Versionstypen:>>稳定>测试版>开发版是否从word或记事本文件复制粘贴?尝试使用dos2unix
是否从word或记事本文件复制粘贴?尝试使用dos2unix
也许这样做会有所帮助:在PSPad中--格式-->Unix
也许这样做会有所帮助:在PSPad--Format-->Unix中
不是答案,而是代码检查:我将重写DO_UPDATE函数:
首先
然后
不是答案,而是代码回顾:我将重写DO_UPDATE函数:
首先
然后
!/bin/sh
或!/bin/bash
?@devnull没有区别!你的'if[!screen-list | grep-q$screen\u NAME]`不需要前后括号。[$\<1]
应该是什么?你的elif
似乎是一个很好的案例陈述的地方。如果[$\<1]
应该是[$\<1]
然后使用[$\\-lt 1]
代替。不是这个问题,而是下一个问题:foo(){if[$\<1];然后echo OK;else echo bad;fi;
然后不使用参数调用它,然后使用1个参数调用它,并让我知道它是否工作。!/bin/sh
或!/bin/bash
?@devnull没有区别!你的'if>[!screen-list | grep-q$screen\u NAME]`不需要前后括号。[$\<1]
应该是什么?你的elif
似乎是写案例陈述的好地方。如果[$\<1]
应该是[$\<1]
,那么就使用[$\\\<1]
相反。不是这个问题,而是下一个问题:foo(){if[$\<1];然后echo OK;否则echo bad;fi;}
然后不使用参数调用它,然后使用1个参数调用它,让我知道它是否工作。我从pastebin复制了它。我没有dos2unix命令。我可以用我的文本编辑器修复这个问题吗?(我正在使用PSPad)@头脑风暴一如果你使用vim
,你可以通过运行:set fileformat=unix
来解决这个问题。我不知道PSPad。我没有使用vim,我没有在windows机器上编写脚本并用ftp客户端上传。我是从pastebin复制的。我没有dos2unix命令。我可以用我的文本编辑器来解决这个问题吗?(我正在使用PSPad)@头脑风暴如果你使用vim
,你可以通过运行:set fileformat=unix
来解决这个问题。不知道PSPad。我没有使用vim,在windows机器上编写脚本并用ftp客户端上传。好的。这似乎可行。我现在有另一个问题,我将在开始的帖子中解释!我猜屏幕列表| grep-q$SCREEN_NAME
需要在方括号中括起来直到相同的问题:(好的。这似乎有效。我现在有另一个问题,我将在开始文章中解释!我猜SCREEN-list | grep-q$SCREEN_NAME
需要在方括号中括起来直到相同的问题:(谢谢;)这是更好的!但是数组似乎有问题。我得到一个sytax错误!15:语法错误:“(MESSAGE\u VERSIONS=(
)数组的第一行是意外的(MESSAGE\u VERSIONS=(
)你有什么版本的bash?GNU bash,版本4.1.5(1)-发行版(x86\u 64-pc-linux-GNU)版权所有(C)2009免费软件基金会,公司许可证GPLV3+:GNU GPL版本3或更高版本,这是免费软件;您可以自由地更改和重新分配它。在法律允许的范围内,没有保证。谢谢!!这是远远好的!但是这个数组似乎有问题。我得到了一个SyError错误!<代码> 15:语法错误:“意外的
第15行是数组的第一行(MESSAGE\u VERSIONS=(
)您有什么版本的bash?GNU bash,版本4.1.5(1)-发行版(x86\u 64-pc-linux-GNU)版权所有(C)2009免费软件基金会,公司许可证GPLV3+:GNU GPL版本3或更高版本。这是免费软件;您可以自由地更改和重新分发它。在法律允许的范围内,没有任何保证。
MESSAGE_VERSION_PROMPT="Bitte Version auswählen: "
MESSAGE_VERSIONS=(
"Stable - Stabile Version"
"Beta - Betaversion"
"Dev - Entwicklungsversion"
)
DO_UPDATE()
{
if (( $# == 0 )); then
local PS3="$MESSAGE_VERSION_PROMPT"
select choice in "${MESSAGE_VERSIONS[@]}"; do
case $REPLY in
1) set -- stable; break ;;
2) set -- beta ; break ;;
3) set -- dev ; break ;;
esac
done
fi
case $1 in
stable)
mkdir $MINECRAFT_PATH
wget $URL_JAR_STABLE -O "$SERVER_JAR_PATH"
;;
beta)
mkdir $MINECRAFT_PATH
wget $URL_JAR_BETA -O "$SERVER_JAR_PATH"
;;
dev)
mkdir $MINECRAFT_PATH
wget $URL_JAR_DEV -O "$SERVER_JAR_PATH"
;;
*)
echo $MESSAGE_INVALID_VERSION
echo $MESSAGE_VERSION_TYPES
return 1
;;
esac
}