私のスクリプトが複数の関数を呼び出すのはなぜですか? [コピー]

私のスクリプトが複数の関数を呼び出すのはなぜですか? [コピー]

私はLinuxを非常に簡単に設定できるようにいくつかのスクリプトセットを作成しました。だから私はこのスクリプトを別の関数にし、すべて1つのスクリプトに入れました。ユーザーが数値のいずれかを入力すると、関数が呼び出されるように数値を設定しました。ただし、ユーザーが数値を入力すると、スクリプトはすべての関数を呼び出します。

n=1
#note you need spaces between [ ]
while [ $n == 1 ]
do
    echo "Base install=1"
    echo "Mintrepos=2"
    echo "Asusn13 driver=3"
    echo "Install Standard openbox=4"
    echo "Install Xfceopenbox=5"
    echo "backing up standard open box config=6"
    echo "backing up openboxfce=7"
    echo
    read choice
    if [ "$choice"==1 ]
    then
        baseinstall
    fi
    if [ "$choice"==2 ]
    then
        linuxmintrepos
    fi
    if [ "$choice"==3 ]
    then
        asusn13driver
    fi
    if [ "$choice"==4 ]
    then
        standardopenbox
    fi
    if [ "$choice"==5 ]
    then
        xfceopenbox
    fi
    if [ "$choice"==6 ]
    then
        backupstandopenbox
    fi
    if [ "$choice"==7 ]
    then
        backupxfc4openbox
    fi
    echo "You installed: "
    if [ "$choice"==1 ]
    then
        echo "baseinstall"
    fi
    if [ "$choice"==2 ]
    then
        echo "linuxmintrepos"
    fi
    if [ "$choice"==3 ]
    then
        echo asusn13driver
    fi
    if [ "$choice"==4 ]
    then
        echo "standardopenbox"
    fi
    if [ "$choice"==5 ]
    then
        echo "xfceopenbox"
    fi
    if [ "$choice"==6 ]
    then
        echo "backupstandopenbox"
    fi
    if [ "$choice"==7 ]
    then
        echo "backupxfc4openbox"
        echo "If you would like to keep going, type in 1, if not, type in any other number"
    read n
    fi

done

ベストアンサー1

変える:

if [ "$choice"==1 ]

そして:

if [ "$choice" = 1 ]

すべての後続のテストに対して同じことを行います。

説明する

シェルがそれを見ると、文字列が表示されます"$choice"==1。たとえば、choice2の場合、文字列が表示されます2==1。これは平等テストではありません。文字列です。空ではない文字列なので、テストはtrueを返します。したがって、すべての選択が実行されます。

同等性テストを認識するにはスペースが必要です。

また、小さな点で[スタイルテストの場合、等号はです=。 bashはこれを許可します==が、正しくなく、他のシェルでは機能しません。

[...]コマンドラインでテストを見る

[コマンドラインでテストがどのように機能するかを簡単に探索できます。まず、空の文字列がfalseでテストされていることを示します。

$ if [ "" ]; then echo True; else echo False; fi
False

空でない文字列は何でも真です。

$ if [ abc ]; then echo True; else echo False; fi
True

それでは、見てみましょう2==1

$ if [ 2==1 ]; then echo True; else echo False; fi
True

2==1空ではない文字列なので、テストはtrueです。

それでは、スペースを追加して同等性をテストしましょう。

$ if [ 2 = 1 ]; then echo True; else echo False; fi
False
$ if [ 2 = 2 ]; then echo True; else echo False; fi
True

もう少し微妙に言えば、=ここでは文字列同一性テストが正しく機能します。数値同等性をテストするには、代わりにを使用してください-eq

$ if [ 2 -eq 2 ]; then echo True; else echo False; fi
True

おすすめ記事