UNIX valid_password

时间:2013-01-31 11:46:29

标签: unix if-statement cygwin ubuntu-10.10

为什么在Cygwin Terminal - 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

2 个答案:

答案 0 :(得分:1)

因为[的正确语法是:

[ a = b ]

从您的错误消息中,它听起来像您写的:

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

将其更改为:

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

注意[之后的空格。 if只需要一个shell命令,尝试运行它,并且如果程序的退出代码是0,它将运行if语句中的命令。

在您的终端中,写下即:

user@localhost$ true; echo $?
0

测试你的if语句:

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

正如@nullrevolution所说,如果你使用双引号会评估!,它会尝试在你的shell历史记录中运行最后一个命令,在这种情况下匹配u

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

这是因为在双引号匹配之前评估!,并且运行echo。如果您仍想使用双引号,则必须在引号外转义!

echo "Access denied"\!

@nullrevolution还说你可以试试bash,它有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

另外在你的程序中我猜你不想在终端中回显密码,关闭echo临时改变:

read password

stty -echo
read password
stty echo

如果您忘记编写stty echo以再次打开回声,只需在终端中写入reset,它就会将终端重置为默认设置。

可以在此处找到有关bourn shell脚本的有用教程:

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

答案 1 :(得分:1)

@emil指出了答案:

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

而不是

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

另外:你给脚本执行权限了吗?尝试

chmod +x script_name