大家好,今天给各位分享syntax是什么意思,syntax的意思翻译、用法、同义词、的一些知识,其中也会对命令的用法和它们之间的区别进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
本篇文章Linuxbash的test命令、[命令、[[命令的用法,以及它们之间的区别。
在bash中,[关键字本身是一个命令,它不是if命令的一部分。
Evaluateconditionalexpression.
Thisisasynonymforthe"test"builtin,butthelastargumentmustbealiteral']',tomatchtheopening'['.
即,[命令用于评估条件表达式。
该命令是test命令的同义词,它对条件表达式的判断结果和test命令完全一样。
但是[命令要求该命令的最后一个参数必须是],看起来是闭合的方括号效果。
在实际使用中,test命令和[命令常常跟if命令、while命令结合使用。
但这不是必须的,test命令和[命令本身和if命令、while命令是独立的,可以单独执行。
后面会用test命令来说明具体的用法,这些说明都适用于[命令。
注意:]自身不是bash的命令,它只是[命令要求的参数,且必须是最后一个参数。
在使用[命令时,最大的误区是在这个命令之后没有加空格。例如[string1=string2]这种写法是错误的。
要时刻注意[本身是一个命令,这个命令名就是[,要在这个命令之后跟着一些参数,要用空格把命令名和参数隔开。
[string1这个写法实际上会执行名为[string1的命令,不是执行[命令。
类似的,]本身是一个参数,它也要用空格来隔开其他参数。string2]这个写法实际上是一个名为"string2]"的参数,而不是string2和]两个参数。
在bash中,可以使用test内置命令来评估条件表达式。
查看manbash对test命令的说明如下:
test:test[expr]
Evaluateconditionalexpression.
Exitswithastatusof0(true)or1(false)dependingontheevaluationofEXPR.
Thebehavioroftestdependsonthenumberofarguments.
Readthebashmanualpageforthecompletespecification.
这个说明提到,test命令的参数个数会影响它的行为,具体要参考manbash的说明。
不同的参数个数会导致test命令返回很多不预期的结果,这是非常关键的点。
具体可以参考前面“Bash技巧:详解test命令的参数个数不同对判断结果的影响”这篇文章的说明。
test命令支持manbash的CONDITIONALEXPRESSIONS小节提到的所有条件表达式,并支持用下面的操作符来组合条件表达式,操作符优先级按从高到低排列:
可以看到,test命令使用-a操作符进行与操作,使用-o操作符进行或操作,不支持||、&&这种写法的操作符。
这些操作符用于组合条件表达式,它们的优先级都低于条件表达式自身的操作符。
注意:在test命令中,每一个操作符(operator)、以及每一个操作符参数(operand)之间都必须用空格隔开。
这里的!、(、)、-a、-o操作符前后也都要加空格。
另外,在bash中,小括号具有特殊含义,(cmd)表示启动一个子shell来执行cmd命令。
所以这里的(和)要用\\转义字符、或者引号来去掉它们的特殊含义,避免被当成命令替换(Commandsubstitution)来处理。
-bash:syntaxerrornearunexpectedtoken'a'
-bash:syntaxerrornearunexpectedtoken'a'
$test'('a==a')';echo$?
-bash:test:||:binaryoperatorexpected
可以看到,test!a==b命令执行报错,!和字符a之间没有用空格隔开,被当成引用历史命令。
test!a==b命令返回0,这里的!操作符优先级低于==操作符,先判断a==b条件表达式,再对a==b条件表达式的判断结果取反,没有执行报错。
test(a==b)命令虽然在各个操作符、操作符参数之间都加了空格,但是没有对(和)进行转义、或者加引号,导致被当成命令替换处理,执行报错。
test(a==b)命令也是把小括号当成命令替换处理,执行报错。
test\\(a==a\\)命令没有执行报错,用\\对小括号进行了转义,不会当成命令替换处理。但是返回为1,看起来认为a等于a是false,这是错误的。
这个命令其实是比较"(a"字符串和"a)"字符串是否相等,这两个字符串显然不相等,所以返回为1.
test\\(a==a\\)命令在\\(和\\)前后加了空格,才是正确的写法,判断出a等于a为true,返回为0。
test'('a==a')'命令用单引号把小括号括起来,小括号不会当成命令替换处理,也可以正常执行。
如果有多个需要转义的字符,可以用引号把整个表达式都括起来。
由于引号内大部分特殊字符都失去特殊含义,所以不需要再转义。
test'(a==a)'命令用就采用了这个写法。
testa'||'b命令执行报错,提示||不是有效的操作符,test命令不支持这种写法的操作符。
在test命令中,如果要进行算术运算,需要用$((expression))来进行算术运算,并获取运算结果,直接写算术运算表达式会报错。
原因在于bash默认没有把-、+这两个字符当成减号、加号来处理,只是普通的字符参数。-常用于指定命令选项。
要在((expression))表达式中才能用-、+这两个字符来进行算术运算。
用$((expression))来获取运算结果。
可以看到,test$count-2-eq2命令和test$count+2-ne2命令都执行报错,提示提供的参数个数过多。
这里的-、+都作为字符参数,传递给test命令。而该命令没有把这两个字符当成减号、加号来处理,不会进行算术运算,最终报错。
test$(($count-2))-eq2命令可以获取到count变量值,并减去2,获取到这个算术运算的结果,然后跟整数2进行比较,最终返回0。
在bash中,可以使用[[复合命令来评估条件表达式。
查看manbash对[[命令的说明如下:
[[expression]]
Returnastatusof0or1dependingontheevaluationoftheconditionalexpressionexpression.
ExpressionsarecomposedoftheprimariesdescribedbelowunderCONDITIONALEXPRESSIONS.
Wordsplittingandpathnameexpansionarenotperformedonthewordsbetweenthe[[and]];tildeexpansion,parameterandvariableexpansion,arithmeticexpansion,commandsubstitution,processsubstitution,andquoteremovalareperformed.
Seethedescriptionofthetestbuiltincommand(sectionSHELLBUILTINCOMMANDSbelow)forthehandlingofparameters(i.e.missingparameters).
即,[[命令支持manbash的CONDITIONALEXPRESSIONS小节提到的所有条件表达式,且对不同参数个数的判断结果跟test命令一致。
[[命令后面必须跟在]]命令,这两个命令前后都要用空格隔开。
在这两个命令中间,不进行单词拆分(wordsplitting)和路径名扩展(pathnameexpansion)。
不进行单词拆分意味着获取字符串变量的值时,即使字符串中间带有空格,也不会被拆分成多个字符串。
-bash:test:test:binaryoperatorexpected
$[[-n"teststring"]];echo$?
-bash:syntaxerrorinconditionalexpression
-bash:syntaxerrornear'string'
可以看到,value变量对应的字符串带有空格,[[-n$value]]命令可以正确判断到value变量值不是空字符串,没有对该变量值进行单词拆分。
而test-n$value命令会执行报错,value变量值带有空格,$value经过单词拆分后会变成两个字符串参数。由于-n操作符不预期后面有多个参数,执行报错。
[[-n"teststring"]]命令也可以正常执行,"teststring"是一个字符串参数。
但是[[-nteststring]]命令会执行报错,这种写法手动进行单词拆分,"test"和"string"会被当成两个字符串参数。
在bash中,获取字符串变量值时,如果不用双引号把变量值括起来,常常会因为变量值为空、或者变量值带有空格进行单词拆分,导致不预期的结果。
大部分情况下,都建议用双引号把变量值括起来。
为了保持写法一致,虽然[[命令内部不进行单词拆分,还是建议用双引号把变量值括起来。
不进行路径名扩展,意味着*、?、[...]通配符不会扩展为当前目录下的文件名,而是保持这几个字符不变。
这些通配符只在部分操作符中可以用于模式匹配。
当[[命令使用==、=、!=操作符时,操作符右边字符串可以使用*、?、[...]通配符来进行模式匹配。
在[[和]]之内,会进行算术扩展,不需要用$((expression))来获取运算结果,直接写为算术表达式即可。但是整个算术表达式之间不能有空格。
如果想要在算术表达式之间加空格,还是要使用$((expression))来进行扩展。
-bash:conditionalbinaryoperatorexpected
-bash:syntaxerrornear'-'
可以看到,[[$count-2-eq2]]命令执行报错。
而[[$count-2-eq2]]命令就可以正常执行。
这里面的$count-2会进行算术运算。
[[$(($count-2))-eq2]]命令使用$(())进行算术扩展,可以在$count、-、2之间加空格,不会执行报错。
[[命令使用==、=、!=操作符时,操作符右边字符串可以使用bash通配符来进行模式匹配。
另外,[[命令还支持一个=~操作符,该操作符右边字符串可以使用扩展正则表达式来作为模式字符串,判断左边字符串是否包含右边的模式字符串。
注意是包含关系,而不是完整匹配。也就是判断右边的模式是否为左边字符串的子字符串,而不是判断右边的模式是否完全等于左边字符串。
由于bash通配符和扩展正则表达式的部分特殊字符是同一个字符,但是具体含义不同,要注意这两个情况的区别,使用正确的写法。
可以看到,[[main.c==*.c]]命令返回0,判断出左边的字符串以.c结尾。
这个写法可以用于判断某个文件名后缀是否为.c。
而[[main.c=~*.c]]命令返回2,报错,右边的扩展正则表达式无效。
在扩展正则表达式中,*不能出现在表达式开头。
注意:在==、=、!=、=~操作符中,操作符右边的字符串可以使用特殊字符来匹配特定模式,但是这些特殊字符不能用引号括起来。这些特殊字符在引号内会失去特殊含义,只能匹配字符自身。
[[命令支持用下面的操作符来组合条件表达式,操作符优先级按从高到低排列:
可以看到,[[命令使用&&操作符进行与操作,使用||操作符进行或操作,不支持test命令的-a、-o的操作符。
在(、)、&&、||操作符前后可以不加空格,也不需要用\\进行转义。
而!操作符前后还是需要加空格。
$[[a!=b&&a!=c]];echo$?
可以看到,[[!a==b]]命令执行命令,!操作符和字符a字之间没有用空格隔开。
[[(a==b)]]命令没有执行报错,判断结果也正确,不需要用\\对(、)进行转义,且小括号前后可以不加空格。
[[a!=b&&a!=c]]命令在&&操作符前后没有加空格,没有执行报错。
[[a!=b||a==a]]命令的情况类似。
[[1<2]]命令不会执行报错,不需要用\\对<进行转义。
而test命令需要用\\对<进行转义。
注意:Bash自身、以及其他命令也支持&&、||操作符。一般来说也是分别对应逻辑与、逻辑或。
由于含义相近,在一些场景下可能会搞混。
在实际执行命令时,一定要注意区分是由哪个命令来处理&&、||操作符,按照对应命令的规则来理解这些操作符的作用,避免出现不预期的结果。
下面具体对比说明test、[、[[这三个命令之间的区别。
[命令是test命令的同义词,大部分用法都是一样的。
唯一明显的区别在于,[命令要求最后一个参数必须是]。
而test命令没有这个要求,也不能处理]参数。
下面会以[命令为例来说明跟[[命令的区别。
[命令和[[命令都可以用来评估条件表达式,在具体使用时,有一些差异,具体对比如下:
关于syntax是什么意思,syntax的意思翻译、用法、同义词、和命令的用法和它们之间的区别的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。