Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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,我一直试图比较Bash中的两个数字是否相等(如果相等,则打印一条消息),但对于这个简单的程序,我得到了一些奇怪的错误消息: #!/bin/bash fun2 (){ $x = 3 //#prog.sh: line 4: =: command not found if [x == 3] then //#prog.sh: line 6: [x: command not found echo "It's 3!"

我一直试图比较Bash中的两个数字是否相等(如果相等,则打印一条消息),但对于这个简单的程序,我得到了一些奇怪的错误消息:

#!/bin/bash

fun2 (){
    $x = 3
    //#prog.sh: line 4: =: command not found
    if [x == 3]
        then
    //#prog.sh: line 6: [x: command not found
            echo "It's 3!"
    fi
}
fun2
相应的错误显示在导致这些错误的行下方。

  • []
    表达式中,空格是必需的,因此

    如果[$x==3];然后

  • []
    测试中,您需要对变量进行测试


对于第一条错误消息,请删除美元符号
$
,等号周围不允许有空格
=

x=3
对于第二条错误消息,请在
x
之前插入空格和美元符号
$
,并在
3
之后插入空格

if [ $x -eq 3 ]
同样,它必须是
-eq
,并且既不是
=
也不是
=

它必须是:

 if [ $x -eq 3 ]; then .....
如果您更喜欢可读性更高、自解释性更强的代码,请使用以下语法:

 if test $x -eq 3; then .....
说明

要比较整数,必须使用这些运算符(从
人工测试中复制):

运算符==和!=仅用于字符串比较


仅供参考:“[”命令是系统“测试”命令的别名。

Shell脚本并不是真正意义上的完整语言,它在很大程度上依赖于其他外部命令来工作

变量使用前面的
$符号。许多shell脚本语言使用变量符号来帮助区分字符串和变量

例如:

foo=foo_value
echo foo foo $foo foo
cat "foo" > my_file       # Create a one line file with the string foo in it.
if grep -q "foo" my_file  # grep command will return a zero exit code if it finds foo
then
    echo "The string 'foo' is in file my_file"
fi
将打印:

foo foo foo_value foo
请注意,字符串的echo语句不需要引号。Windows批处理shell非常类似:

set foo = foo_value
echo foo foo %foo% foo
如您所见,sigil在变量应该展开时使用,但在您定义变量时不使用。这是因为Unix shell是智能shell。它们甚至在执行命令行之前都会咀嚼命令行。在执行之前,shell将替换环境变量:

foo=bar
$foo="whose value is this"  # Note the dollar sign!
echo The value of foo is $foo
echo The value of bar is $bar
这将打印出:

The value of foo is foo
The value of bar is whose value is this
如果使用
set-xv
命令,您将看到
$foo=“which value is this”
在执行之前被扩展为
bar=which value is this”

在Bourne样式的Shell(如和Bash)中,
if
语句不是您认为的那样。如果该命令返回零值,
if
命令将执行该语句,并将选择if子句。例如:

foo=foo_value
echo foo foo $foo foo
cat "foo" > my_file       # Create a one line file with the string foo in it.
if grep -q "foo" my_file  # grep command will return a zero exit code if it finds foo
then
    echo "The string 'foo' is in file my_file"
fi
注意if子句不是一个布尔语句,它是一个实际执行的命令

Unix开发早期的某个地方创建了
test
命令。您可以进行man测试并了解如何使用它

test
命令允许您执行以下操作:

foo=3
bar=3
if test foo -eq bar
then
    echo "foo and bar are equal"
else
    echo "foo and bar are not equal"
fi
如果您这样做:

$ ls -li /bin/test /bin/[
您将看到名为
[
的命令实际上存在,它是指向
test
命令的硬链接。创建该命令是为了使
if
语句看起来更像常规编程语言中的if语句:

foo=3
bar=3
if [ foo -eq bar ]
then
    echo "foo and bar are equal"
else
    echo "foo and bar are not equal"
fi
它与上面的脚本完全相同,但是使用了
[
而不是
test

这解释了为什么在许多测试中需要破折号(它是
test
命令的一个参数,参数以破折号开头!)。它还解释了为什么在
[
]
周围需要空格。这些是实际的Unix命令,Unix命令周围必须有空格,以便shell可以处理它们

另一个问题是:为什么shell对字符串和数字有两组不同的测试?这是因为字符串可能只包含数字,但不是真正的数字。例如,如果您进行库存,您可能有一个零件号
001
01
。从数字上看,它们是相等的,但作为字符串,它们是两个不同的字符串。shell脚本无法知道。相反,您必须让shell脚本知道它是数值比较还是字符串比较

Perl也有类似的问题,因为您没有将变量声明为数字或非数字:

                         Shell Script              Perl
Boolean Operator     Numeric     String     Numeric    String
===================  =======     ======     =======    ======
Equals                 -eq        =           ==         eq
Not Equals             -ne        !=          !=         ne
Greater Than           -gt        >           >          gt
Less Than              -lt        <           <          lt
Greater or Equals      -ge        >=          >=         ge
Less Than or Equals    -le        <=          <=         le
请再次注意,shell在执行echo命令之前会展开
*
。这是shell脚本与典型编程语言之间的主要区别。shell在实际执行命令之前会首先进行展开(填写环境变量、glob替换和run sub命令)


set-xv
将向您显示正在执行的命令,以及shell在执行之前如何扩展命令。执行
set+xv
将关闭该命令。尝试一下,您很快就会更好地理解shell。

为了清晰起见,使用
=
表示相等,而不是
=
,即使两者都是rk.前者鼓励使用
[[
,后者可能与赋值混淆。使用
(…)
-lt
-gt
进行数值比较

如果[[“${my_var}”==“val”];那么
做点什么
fi
如果((my_var==3));那么
做点什么
fi
如果[[“${my_var}”-gt 3]];那么
做点什么
fi

我已重新打开,因为副本是关于与大于/小于的比较,这是关于相等。