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")

そして、Creative + Survival を選択すると、同じことが起こります。ばかげた質問で申し訳ありませんが、これは私の最初の bash スクリプトの 1 つです。

ありがとうございました!

4

4 に答える 4

3

thenbashでは、新しい行にある必要があることを覚えておく必要があります。残念ながら、あなたの発言全体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 シェルで許可されているのは (これは POSIX 標準ではないため移植性はありませんが)、二重括弧を使用することです。

if [[ "$server" = "Creative+Survival" ]]
then

[[[、およびの違いを説明するページへのリンクは次のtestとおりです: http://mywiki.wooledge.org/BashFAQ/031


アップデート

Q:これは機能しているように見えますが、「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ステートメントを使用します。あなたがbashv4を持っていると仮定します

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 に答える