为什么在 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
为什么在 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
因为正确的语法[
是:
[ 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 脚本的有用教程:
@emil 指出了答案:
if [ "$password" = "$valid_password" ]
代替
if [ "$password" == "$valid_password" ]
另外:您是否授予脚本执行权限?尝试
chmod +x script_name