'>' 和 '-gt' 之间的区别

IGG*_*GGt 1 shell test

这些有什么区别:

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

SEC=100
Run Code Online (Sandbox Code Playgroud)

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

if [ ${SEC} > 1 ]
then
    echo "SEC GT 1"
else
    echo "SEC LT 1"
fi
Run Code Online (Sandbox Code Playgroud)

第一个返回:

"SEC GT 1"
Run Code Online (Sandbox Code Playgroud)

第二个返回:

"SEC LT 1"
Run Code Online (Sandbox Code Playgroud)

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

if [ ${SEC} -gt 1 ]
Run Code Online (Sandbox Code Playgroud)

那么结果是相反的。

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

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

Gil*_*il' 5

最初,[是作为一个普通命令实现的,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 中使用。不像[ … ],这是一个普通的命令,[[ … ]]是由外壳的解析器的认可,所以特殊字符,例如(<里面可以使用,无需引用(实际上它们不能被引用)。因为-lt和朋友已经可以进行数值比较,并且=已经在进行字符串比较,所以<朋友是字符串比较运算符(字典顺序¹)。因此,例如,[ 9 -lt 10 ]但是[[ 10 < 9 ]]

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