“>”和“-gt”之间的区别

“>”和“-gt”之间的区别

这些有什么区别:

SEC=$(mysql -hxxx -Pxxx -uxxx -pxxx -se "SELECT Seconds FROM tablename")

SEC=100

两者返回相同的结果 (100)。但是当我测试它时:

if [ ${SEC} > 1 ]
then
    echo "SEC GT 1"
else
    echo "SEC LT 1"
fi

第一个返回:

"SEC GT 1"

第二个返回:

"SEC LT 1"

但是,如果我将其更改为:

if [ ${SEC} -gt 1 ]

那么结果就相反了。

我假设它与数据类型有关,并且我大概需要cast其中之一才能获得相同的结果。

只是目前它扰乱了我的测试,因为我必须记住IF每次都更改该部分。

答案1

最初,[是作为普通命令实现的,与其他命令相同,test只是[需要在末尾有一个额外的参数,该参数必须是]。 (它仍然作为普通命令存在,但大多数 shell 也有内置命令。)鉴于它是一个受普通解析影响的普通命令,它不能使用数学运算符<并且>不加引号:[ ${SEC} > 1 ]包含重定向运算符,它是等效的to [ ${SEC} ] >1,将命令的(空)输出重定向[到名为1.该[命令主要遵循以破折号开头的特殊选项的通常约定:其大多数运算符都以破折号开头。因此,需要[ -r foo ]测试一个文件是否可读,[ -r foo -a -w bar ]用“and”运算符将两个测试结合起来,[ $x -eq $y ]测试$x和是否$y相等等等。

这些较旧的 shell 具有字符串相等性(=运算符,是少数几个偏离破折号字母约定的运算符之一),但没有字符串排序。不过,他们进行了数值比较,例如[ $x -le $y ]测试整数是否$x小于或等于$y,并且这组运算符包括数值相等[ $x -eq $y ][ 010 -eq 8 ]因为前导零意味着该数字是八进制的。

Ksh 引入了语法[[ … ]],现在也可在 bash 和 zsh 中使用。与 不同的是[ … ],它是一个普通命令,[[ … ]]可以被 shell 的解析器识别,因此可以在内部使用特殊字符(例如和(<而无需引号(实际上它们不能被引号括起来)。由于-lt和 朋友已经可用于数值比较,并且=已经在进行字符串比较,<并且朋友被制作为字符串比较运算符(字典顺序1)。因此,例如,[ 9 -lt 10 ]但是[[ 10 < 9 ]]

1该实用程序提供字符串排序expr功能;它是exprPOSIX shell 的功能中没有包含的少数用途之一。但请注意,expr使用相同的运算符进行字符串和数字比较,因此expr 9 \< 10but expr a9 \> a10
²字符串是被解释为字节字符串,还是当前语言环境中的字符串,取决于 shell

相关内容