Bash脚本-如果使用[]
我有下面的代码,并收到以下错误输出:Bash脚本-如果使用[],bash,Bash,我有下面的代码,并收到以下错误输出: 输入您的考试分数 40 ./if2.sh:第6行:40:没有这样的文件或目录 做得很好。你的成绩是A。 我在CentOS上使用Bash4.1.2(1) #!/bin/bash #This script demonstrates the if-then-elif format. echo "Enter your exam score" read exam_pct if [ $exam_pct < 40 ] then echo "Sorry,
输入您的考试分数
40
./if2.sh:第6行:40:没有这样的文件或目录
做得很好。你的成绩是A。
我在CentOS上使用Bash4.1.2(1)
#!/bin/bash
#This script demonstrates the if-then-elif format.
echo "Enter your exam score"
read exam_pct
if [ $exam_pct < 40 ]
then
echo "Sorry, you have failed."
elif [ $exam_pct > 70 ]
then
echo "Very well done. You have an A grade."
else
echo "Well done. You passed."
fi
#/bin/bash
#此脚本演示if-then-elif格式。
echo“输入您的考试分数”
阅读考试
如果[$exam_pct<40]
然后
echo“对不起,您失败了。”
elif[$exam_pct>70]
然后
echo“做得很好,你得了A级。”
其他的
埃科:“干得好,你通过了。”
fi
这里怎么了?更换
if [ $exam_pct < 40 ]
if[$exam\u pct<40]
与
if((检查pct<40))
看看Bill给出的链接。unixshell历史记录中充满了非直观的扩展。根据您的情况,Bash应该可以安全使用。
如果您对shell历史感兴趣,请查看
如果[$exam\u pct<40]
应该是如果[“$exam\u pct”-lt 40]
if[$exam\u pct>70]
应该是if[“$exam\u pct”-gt 70]
请始终引用您的变量
查看此处以了解更多详细信息-详细说明出现错误的原因:
[
不是特殊的语法;它只是一个(通常通过内置的,但系统上可能存在/usr/bin/[
)按惯例将“]”作为其最后一个参数
因此,当您编写[$exam\u pct<40]
时,您实际要做的是以两个参数(理想情况下)开始[
(两个参数分别是$exam\u pct
和]
)的内容,并将名为40
的文件的内容传输到其stdin
类似地,当您执行[$exam\u pct>70]
操作时,您将[$exam\u pct]
的输出重定向到一个名为70
的文件中(该文件将为空,因为[/code>从未写入标准输出),以确保完整性:
if [ $exam_pct \< 40 ]
if[$exam\u pct\<40]
同样有效我需要[]有什么特别的原因吗?我读过的所有材料都声明[],除非这些材料只用于较旧版本的bash。[[]]是一个bash扩展。它使测试条件更加通用。但是!您不应该将用户输入传递给算术表达式,因为它可能会导致算术语法错误。(尝试键入40foo
或者甚至40foo
来回答这个问题。)@williampersell不能移植到POSIX,是的,但是[[
也不是严格意义上的bash主义;它在这里的用法在ksh或zsh中也是相同的。而且,这是一个带问题标签的bash……如果您使用的是[]
;[[[]]
和(()),那么在这种情况下,您只需要引用您的扩展
是语法,不管怎样都可以防止分词和全局扩展……顺便说一句,ABS是一个非常糟糕的参考资料;它在该页面上的许多建议(例如,宁愿(“$a”>“$b”)
而不是((a>b))
)是完全有害的。(对于空内容,显式扩展会导致语法错误,而数学上下文中的隐式扩展不会导致语法错误)。[
是一个命令。如果拼写正确,Shell脚本会更清晰,正确的拼写是test
。当您编写if-test$exam\u pct<40
时,更明显的是,您试图调用命令test$exam\u pct
,并从文件40
重定向输入。它不在,因此只能通过非标准扩展工作。使用[
或test
符合标准不是唯一的目的吗?我不认为这是一个非标准扩展,而是一种保护但是…但是…但是…OP需要整数比较,而不是字符串比较的方法。
if [ $exam_pct \< 40 ]