4

我的 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 服务器的脚本。我最终也会为所有其他服务器添加 if 条目。这是我不选择 Creative+Survival 时的输出:

Server Startup - INCOMPLETE.sh: 20: Server Startup - INCOMPLETE.sh: Syntax error: "else" unexpected (expecting "then")

当我选择创意+生存时,同样的事情也会发生。抱歉,如果这是一个愚蠢的问题,这是我的第一个 bash 脚本之一。

谢谢!

4

4 回答 4

3

在 bash 中,您必须记住then必须在新行中。不幸的是,你的整个if陈述是不正确的。正确的字符串比较看起来像这样:

 if [[ "$server" = "pattern" ]]; then
       # do something
 else
       # do something else
 fi
于 2012-12-28T17:32:38.360 回答
3

[缺少括号(测试)运算符。它应该是这样的:

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

[这是描述、[[和之间差异的页面链接:http test: //mywiki.wooledge.org/BashFAQ/031


更新

问:这似乎有效,但如果我选择“Creative+Survival”以外的任何内容,它会吐出错误代码。这应该发生吗?

A:目前还不清楚是哪个组件吐出了什么错误代码。我希望您要检查每个可能的选择。您可以使用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
    echo "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 关心换行符,而不是前导空格。)

于 2012-12-28T17:32:49.313 回答
2

您的 if 语句不正确。

  • 条件放在括号内:[[...]]
  • then换行
  • 语句以finot结尾end

还有一个我已经修复的无用用法。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
于 2012-12-28T17:33:16.783 回答
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

此外,不要使用 zenity,而是使用 bash 的select语句。假设你有 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
于 2012-12-28T18:16:58.477 回答