#!/bin/bash
echo "Int. a number"
read num1
echo "Int. another numer"
read num2
if ["$num1"="$num2"]; then
echo "Equals"
else
echo "Dif"
fi
if["$num1"<0]; then
echo "The number $num1 is negative"
else if ["$num2"<0]; then
echo "The number $num2 is negative"
fi
#
该代码不起作用,当我看到数字小于 0 时,我发现了一些错误。
谢谢
答案1
[
语法错误。请阅读有关命令 ( help [
/ help test
)的文档
每个参数必须是其自身的参数,即,必须在 之间使用空格:[ "$num1" == "$num2" ]
。第一次检查没有看到错误的原因是,它尝试查找名为 (num1=3 和 num2=4) 的命令[3==4]
,但该命令不存在,因此表达式的计算结果为 false。在第一次检查中,您编写了一个<
,它是 shell 运算符输入重定向. 它尝试打开文件4]
,但大多数情况下该文件并不存在。
然而,当比较数字时,您应该使用-eq
类似的,==
用于字符串比较:[ 3 == 3.0 ]
为假,[ 3 -eq 3.0 ]
为真。
答案2
在 Bash 中,如果使用算术评估,您可以使用熟悉的运算符进行数字比较:
if ((num1 ==num2 ))
if ((num1<0)) # in this context, < is not evaluated as a redirection operator
else if (( $num2 < 0 ))
如您所见,我使用空格相当自由,如果需要,可以省略美元符号。不过您应该注意这一点:
a= # set to nothing, thus null
if (( a == 0 )); then echo "ok"; fi # echoes "ok" since a evaluates to 0
if (( $a == 0 )); then echo "ok"; fi # produces an error even if $a is quoted
如果使用双方括号,则可以使用“<”和“>”代替“-lt”和“-gt”进行字符串比较。对空格的要求与对单方括号的要求相同。
s="b"
if [[ "$s" > "a" ]]
t= # null
if [[ $t < "a" ]] # evaluates to true
正如您在最后一个例子中看到的,当使用双方括号时,不需要用引号括起来变量以防止它们为空或未设置的可能性,这与使用单方括号不同。
答案3
您使用的运算符进行字符串比较。您应该使用 -eq 表示整数相等,使用 -lt 表示小于,等等(它们也应该用空格括起来)。