为什么在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
答案 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脚本的有用教程:
答案 1 :(得分:1)
if [ "$password" = "$valid_password" ]
而不是
if [ "$password" == "$valid_password" ]
另外:你给脚本执行权限了吗?尝试
chmod +x script_name