当我需要其他东西时,BASH脚本期待着

当我需要其他东西时,BASH脚本期待着,bash,if-statement,syntax-error,Bash,If Statement,Syntax Error,我需要一些关于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 Tekki

我需要一些关于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条目。 这是我未选择“创意+生存”时的输出:

Server Startup - INCOMPLETE.sh: 20: Server Startup - INCOMPLETE.sh: Syntax error: "else" unexpected (expecting "then")
当我选择“创造性+生存”时,同样的事情也会发生。抱歉,如果这是一个愚蠢的问题,这是我的第一个bash脚本之一


谢谢大家!

在bash中,您必须记住
然后
必须在新行中。不幸的是,您的整个
if
语句不正确。正确的字符串比较如下所示:

 if [[ "$server" = "pattern" ]]; then
       # do something
 else
       # do something else
 fi

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

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
这里有一个页面链接,介绍了
[
[[
测试之间的区别:


更新


Q:这似乎可行,但如果我选择了“创造性+生存”之外的任何选项,它会抛出一个错误代码。这应该会发生吗

A:不清楚哪个组件发出了什么错误代码。我希望您希望检查每个可能的选择。您可以使用
elif
案例来执行此操作

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关心的是换行,而不是前导空格。)

if语句不正确

  • 条件放在括号内:
    […]
  • 然后
    换一行
  • 语句以
    fi
    not
    end
还有一个问题我已经解决了

试试这个:

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

其他人已经回答了语法问题

展望未来,
案例
声明将很好地为您服务:

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
语句

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

我发现这是非常有用的:猫被发现的无用用法!
../cat>../code>很可怕(同时也很有趣…)嘿,为什么不
../cat | cat | cat | cat | cat | cat | cat | cat | cat>..
当你在做的时候?
:-)
purrrrrrr和
var=$(cat文件)
最好写成
var=$(cat文件)
。谢谢大家的回答!我好不容易才选出了“最好”的答案,它们都很棒!这绝对是最好的答案,所有提问者的错误都被纠正了!谢谢dogbane,
+1
。这似乎行得通,但如果我选择了“创造性+生存”以外的任何选项,它会吐出一个错误代码。这是应该发生的吗?我希望您希望使用一系列
elif
来检查其他条件,或者使用
case
语句来检查多个条件。对于我来说,(我)根本不清楚脚本中的哪个组件发出了什么错误代码。在$server周围需要双引号(即,
if[“$server”=“创造性+生存”]
等),否则如果它包含空格,事情会变得非常混乱。@Gordon Davisson:很好。如果我测试它,我会发现这一点,这就是为什么我应该测试它。