为什么在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
@emil指出了答案:
if [ "$password" = "$valid_password" ]
而不是
if [ "$password" == "$valid_password" ]
另外:您是否授予了脚本执行权限?尝试
chmod +x script_name
因为要[
的正确语法是:
[ 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
同样在您的程序中,我猜您不想在终端中回显密码,以关闭回显临时更改:
read password
自
stty -echo
read password
stty echo
如果您忘记写stty echo
再次打开 Echo,只需在终端中写入reset
,它就会将终端重置为默认设置。
可以在此处找到有关 bourn shell 脚本的有用教程:
http://www.grymoire.com/Unix/Sh.html