2

Cygwin ターミナルでの理由 - if ステートメントが機能
し、ubuntu - unix -
このコードでは機能しない:

#!/bin/sh
valid_password="pass"

echo "Please enter the password:"
read password

if [ "$password" == "$valid_password" ]
then
   echo "You have access!"
else
   echo "Access denied!"
fi
4

2 に答える 2

1

の正しい構文[は次のとおりです。

[ a = b ]

あなたのエラーメッセージから、あなたが書いたように聞こえます:

if ["$password" = "$valid_password" ]

これを次のように変更します。

if [ "$password" = "$valid_password" ]

の後のスペースに注意して[ください。シェルコマンドを取り、それを実行しようとすると、プログラムからの終了コードがステートメント内でコマンドを実行するifかどうかに応じて実行されます。0if

端末で、次のように記述します。

user@localhost$ true; echo $?
0

if ステートメントをテストするには:

user@localhost$ pass=pass; valid=pass
user@localhost$ if [ "$pass" = "$valid" ]; then echo 'You have access!'; fi

@nullrevolution が言ったように、!二重引用符を使用すると が評価され、シェル履歴の最後のコマンドを実行しようとします。この場合、一致するu.

user@localhost$ uname
Linux
user@localhost$ !u
uname
Linux
user@localhost$ echo "!"
sh: !: event not found

これは!、二重引用符が一致する前に が評価され、echo が実行されるためです。それでも二重引用符を使用したい場合は!、引用符の外側をエスケープする必要があります:

echo "Access denied"\!

bash@nullrevolution はまた、 if ステートメント内の式の組み込み構文を持つ で試すことができると述べました。

#!/bin/bash

valid_password=pass

echo "Please enter the password:"
read password

if [[ "$password" == "$valid_password" ]]; then
    echo 'You have access!'
else
    echo 'Access denied!'
fi

また、あなたのプログラムでは、一時的な変更のエコーをオフにするために、ターミナルでパスワードをエコーし​​たくないと思います。

read password

stty -echo
read password
stty echo

stty echoエコーを再度オンにするために書き込むのを忘れた場合resetは、端末に書き込むだけで、端末がデフォルト設定にリセットされます。

bourn シェル スクリプトの便利なチュートリアルは次の場所にあります。

http://www.grymoire.com/Unix/Sh.html

于 2013-01-31T11:47:58.200 に答える
1

@emil は答えを指摘しました:

if [ "$password" = "$valid_password" ]

それ以外の

if [ "$password" == "$valid_password" ]

また、スクリプトに実行権限を与えましたか? 試す

chmod +x script_name
于 2013-01-31T12:57:47.680 に答える