当前位置: 首页 > Linux

bash技巧:详解test命令不同参数个数对判断结果的影响

时间:2023-04-06 06:56:17 Linux

在linuxbashshell中,使用test内置命令时,[内置命令,以及[[内置命令在命令判断中,提供的参数数量会有所不同。影响判断结果。下面以test命令为例介绍其具体影响,这些说明同样适用于[命令和[[命令。查看manbash里面对test命令不同参与数的判断结果说明如下:testand[evaluateconditionalexpressionsusingasetofrulesbasedonthenumberofarguments.0argumentsTheexpressionisfalse.1argumentTheexpressionistrueifandonlyiftheargumentisnotnull.2arguments如果第一个参数是!,当且仅当第二个参数为null时,表达式为真。如果第一个参数是上面在条件表达式下列出的一元条件运算符之一,则如果一元测试为真,则表达式为真。如果第一个参数不是有效的一元条件运算符,则表达式为false。3个参数以下条件按列出的顺序应用。如果第二个参数是上面条件表达式下列出的二元条件运算符之一,则表达式的结果是使用第一个和第三个参数作为操作数的二元测试的结果。如果第一个参数是!,则value是使用第二个和第三个参数对双参数测试的否定。对于不同个数的参数,具体举例如下:0arguments$test;echo$?1这里直接执行test命令,不提供任何参数。参考上面“0个参数”的描述,这种情况下的返回值总是false。用echo$打印?返回值1。请注意,测试命令将1视为false。1个参数$测试-n;回声$?0$测试-z;回声$?0$测试-y;echo$?0$set-x$测试"";echo$?;+测试''+echo11$测试$dummy;echo$?+test+echo11$set+x在这里分别执行test-n和test-z两条命令。使用回声$?打印这两条命令的返回值为0,都返回true。请注意,测试命令将0视为真。参考上面“1个参数”的描述,当只提供一个参数时,只要参数不为空,就会返回true。此时,-n和-z被视为普通字符串参数,而不是测试命令的运算符。可以看到执行test-y也返回true。但是测试命令不支持-y运算符。在helptest的描述中,testSTRING命令在STRING不为空时会返回true,使用只提供一个参数时的判断规则。请注意上面的test""和test$dummy之间的区别。查看上面打印的调试信息,test""被bash展开,结果为test''。即确实有一个参数,而这个参数是一个空字符串。根据“1论证”,此时返回结果为false。由于没有定义dummy变量,test$dummy被bash展开,结果只有test,没有提供任何参数。如“0个参数”所述,返回值为false。也就是说,虽然test""和test$dummy都返回false,但它们有不同数量的参数和不同的结果原因。2个参数$test-ygo;echo$?-bash:test:-y:unaryoperatorexpected2$test-ngo;echo$?0$值="";设置-x$测试!-n$值;echo$?+测试'!'-n+echo11$测试!-n“$值”;echo$?+测试'!'-n''+echo00$set+x对于两个参数,如果第一个参数不是一元条件运算符,则返回结果为false。由于test命令不支持-y运算符,所以执行test-ygo命令时会报错。执行test-ngo命令会返回-n运算符对后面参数的判断结果。注意test之间的区别!-n$值和测试!-n"$value"以上。上面value变量设置为空字符串,测试!-n$value被bash展开,结果是test'!'-n,提供两个参数。如“2个参数”所述,当第一个参数为!时,仅当第二个参数为空时才返回true。这里的第二个参数不为空,所以返回false。并测试!-n"$value"展开以测试'!'-n'',提供三个参数。按照“3个参数”描述的规则进行判断,后两个参数的判断结果会取反。这最终返回true。3arguments$test-ngoon-bash:test:go:binaryoperatorexpected在这个测试例子中,test-n后面的字符串包含空格,并且字符串没有用双引号括起来,所以参数个数会增加。这里提供了三个参数,-n也是一个参数。参考上面“3个参数”的描述,当提供三个参数时,第二个参数应该是二元条件运算符。由于这里没有提供,所以执行报错,提示“go:binaryoperatorexpected”。也就是说,给定的第二个参数“go”应该是一个“二元运算符”,但它不是。总结一般情况下,引用变量值不用双引号。当参数值为空或包含空格时,测试命令的参数个数会发生变化。之后根据不同参数号的判断规则进行处理,可能会出现意想不到的结果。结合上面的例子我们可以看出,用双引号括住变量值只会得到一个参数,保持参数个数不变可以避免很多异常。