我需要一点帮助我的bash脚本:
#!/bin/bash
zenity --list --title="Select Server" --text="Select the server to start" --radiolist \
--column= --column=Server --column=Port \
FALSE "Creative+Survival" 25565 \
FALSE "Tekkit Cheat Survival" 25566 \
FALSE "Flat Tekkit" 25567 \
FALSE "SunnyDale City" 25568 \
FALSE "Doom Dungeon" 25569 \
FALSE "Survival Tekkit" 25570 \
| cat > ~/temp
server=$(cat ~/temp)
if $server="Creative+Survival" then
gnome-terminal -x sh "/home/kulboy121/Servers/Creative and Survival/launch.sh"
end
else
echo wrong answer...
end
rm ~/temp
这是一个启动我拥有的一些Minecraft服务器的脚本。我最终会添加所有其他服务器的条目。 这是我没有选择Creative + Survival时的输出:
Server Startup - INCOMPLETE.sh: 20: Server Startup - INCOMPLETE.sh: Syntax error: "else" unexpected (expecting "then")
当我选择Creative + Survival时,同样的事情发生了。很抱歉,如果这是一个愚蠢的问题,这是我的第一个bash脚本之一。
谢谢!
答案 0 :(得分:3)
在bash中,您必须记住then
必须在新行中。不幸的是,您的整个if
声明不正确。正确的字符串比较看起来像这样:
if [[ "$server" = "pattern" ]]; then
# do something
else
# do something else
fi
答案 1 :(得分:2)
缺少括号[
(测试)运算符。它应该是这样的:
if [ "$server" = "Creative+Survival" ]
then
echo "true"
else
echo "false"
fi
注意:这些括号周围的空格很重要。
条件测试周围的方括号实际上是test
运算符的同义词。
所以上面相当于:
if test "$server" = "Creative+Survival"
then
echo "true"
else
echo "false"
fi
但每个人都使用括号;我很少看到使用test
关键字的脚本。
在bash shell中也允许(虽然这不是便携式的,因为它不是POSIX标准)是使用双括号:
if [[ "$server" = "Creative+Survival" ]]
then
以下是指向[
,[[
和test
之间差异的页面链接:
http://mywiki.wooledge.org/BashFAQ/031
<强>更新强>
问:这似乎有效,但是如果我选择“Creative + Survival”之外的任何其他内容,它会发出错误代码。这应该发生吗?
答:目前还不清楚哪个组件正在吐出什么错误代码。我希望你能检查每个可能的选择。您可以使用elif
或case
if [ "$server" = "Creative+Survival" ]
then
echo "Creative and Survival"
elif [ "$server" = "Tekkit Cheat Survival" ]
then
echo "Tekkit Cheat Survival"
elif [ "$server" = "Flat Tekkit" ]
then
echo "Flat Tekkit"
else
ehco "no action for specified server"
fi
case "$server" in
'Creative+Survival')
echo "Creative and Survival"
;;
'Tekkit Cheat Survival')
echo "Tekkit Cheat Survival"
;;
*)
echo "no action found for server $server"
;;
esac
(注意:缩进仅用于提高可读性; bash关心换行符,而不是前导空格。)
答案 2 :(得分:2)
您的if语句不正确。
[[...]]
then
上了新的一行fi
而不是end
我还修复了Useless Use of cat
。
试试这个:
server=$(zenity --list --title="Select Server" --text="Select the server to start" --radiolist \
--column= --column=Server --column=Port \
FALSE "Creative+Survival" 25565 \
FALSE "Tekkit Cheat Survival" 25566 \
FALSE "Flat Tekkit" 25567 \
FALSE "SunnyDale City" 25568 \
FALSE "Doom Dungeon" 25569 \
FALSE "Survival Tekkit" 25570)
if [[ $server == "Creative+Survival" ]]
then
gnome-terminal -x sh "/home/kulboy121/Servers/Creative and Survival/launch.sh"
else
echo wrong answer...
fi
答案 3 :(得分:1)
其他人已经回答了语法问题。
展望未来,case
声明将为您提供良好的服务:
server=$(...)
case $server in
"Creative+Survival")
gnome-terminal -x sh "/home/kulboy121/Servers/Creative and Survival/launch.sh"
;;
"Tekkit Cheat Survival")
# do something
;;
"Flat Tekkit")
# do something
;;
"SunnyDale City")
# do something
;;
"Doom Dungeon")
# do something
;;
"Survival Tekkit")
# do something
;;
*)
echo wrong answer
;;
esac
此外,使用bash的select
语句,而不是使用zenity。假设你有bash v4
declare -A port
port["Creative+Survival"]=25565
port["Tekkit Cheat Survival"]=25566
port["Flat Tekkit"]=25567
port["SunnyDale City"]=25568
port["Doom Dungeon"]=25569
port["Survival Tekkit"]=25570
PS3="Select server: "
select server in "${!port[@]}"; do
if [[ -n $server ]]; then
# user has given a valid selection
echo do something with "$server" and "${port[$server]}"
break
fi
done