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只需要一个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 还说您可以尝试 with 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

同样在您的程序中,我猜您不想在终端中回显密码,以关闭回显临时更改:

read password

stty -echo
read password
stty echo

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

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

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 回答