Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本-如果使用[]_Bash - Fatal编程技术网

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 ]