Bash脚本 - 如果以[]为条件

时间:2013-06-18 02:23:05

标签: bash

我有以下代码,并收到以下错误输出:

Enter your exam score
40
./if2.sh: line 6: 40: No such file or directory
Very well done. You have an A grade.

我在CentOS上使用bash 4.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

这里有什么问题?

4 个答案:

答案 0 :(得分:4)

替换

if [ $exam_pct < 40 ]

if (( exam_pct < 40 ))

看看Bill给出的链接。 Unix shell历史记录充满了非直观的扩展。根据您的情况,Bash应该可以安全使用。 如果您对shell历史感兴趣,请查看http://www.in-ulm.de/~mascheck/bourne/

答案 1 :(得分:4)

if [ $exam_pct < 40 ]应为if [ "$exam_pct" -lt 40 ]

if [ $exam_pct > 70 ]应为if [ "$exam_pct" -gt 70 ]

请始终引用您的变量。

请查看此详细信息 - http://tldp.org/LDP/abs/html/comparison-ops.html

答案 2 :(得分:3)

详细说明您收到错误的原因:[不是特殊语法;它只是一个executable(通常是通过内置提供的,虽然/usr/bin/[可能存在于你的系统中),按照惯例,它以“]”作为它的最后一个参数。

所以当你写[ $exam_pct < 40 ]时,你实际做的是用(理想情况下)两个参数([$exam_pct的内容)开始],以及名称为40的文件的内容通过管道传输到其标准输入。

同样,当你执行[ $exam_pct > 70 ]时,你将[ $exam_pct ]的输出重定向到一个名为[的输出(因为70不会写入stdout) {{1}}。

答案 3 :(得分:1)

为了完整性:

if [ $exam_pct \< 40 ]

也有效