这些有什么区别:
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
功能;它是expr
POSIX shell 的功能中没有包含的少数用途之一。但请注意,expr
使用相同的运算符进行字符串和数字比较,因此expr 9 \< 10
but expr a9 \> a10
。
²字符串是被解释为字节字符串,还是当前语言环境中的字符串,取决于 shell