检查Bash中的一个数字是否等于另一个数字
我一直试图比较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!"
#!/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
我已重新打开,因为副本是关于与大于/小于的比较,这是关于相等。