我正在做一些shell脚本类的功课,并有一个问题要求我写一个脚本,testinginput的参数是否是一个有效的shellvariables名称。 下面的脚本似乎工作正常。
if echo "$1" | grep -v ".*[^A-Za-z_]" > /dev/null then echo yes else echo no fi
我知道括号是BASH shell中testing函数的简称。 我的问题是,当我尝试使用括号上面的脚本我得到一个错误。
if [ echo "$1" | grep -v ".*[^A-Za-z_]" > /dev/null ]
这个问题(我相信)是grep试图使用]作为它的参数,从而导致脚本运行时的错误。
在什么情况下我不需要括号?
如你所说, [
/ test
是一个命令(也是一个内置的)。 这是一个接受特定排序参数的命令,并且在给定这些参数的情况下以特定方式运行。
它接受标志和比较运算符,并对这些运算符进行操作以获得true
或false
结果。 然后将结果转换为返回码。 0
为true
, 1
为false
。
定义了shell中的if
构造
如果列表; 然后列出; [elif list; 然后列出; ] … [else list; ] fi
if列表被执行。 如果其退出状态为零,则执行该列表。 否则,依次执行每个elif列表,如果退出状态为零,则执行相应的列表,命令完成。 否则,执行else列表(如果存在)。 退出状态是执行的最后一个命令的退出状态,如果条件不成立,则退出状态为真。
所以当[
/ test
返回一个退出代码, if
评估。
你不需要(也不能使用) [
在echo
命令/管道周围的原因是因为这不是一个有效的[
参数集[
。 相反,这是一个命令list
本身,因此,不需要由[
。 您可以直接使用它,并将管道的返回代码提交给评估。
[
实际上是一个命令(它恰好被构建到大多数shell中),而不仅仅是if
语句的一部分。
if
语句执行作为其参数的命令。 如果该命令成功 (将$?
设置为零),则条件成立; 如果失败 (将$?
设置$?
某个非零值),则条件为false。
内置的[
命令几乎完全等同于test
命令; 不同之处在于[
需要]
作为最后一个参数。
你也可以使用双方括号[[
而不是单[
在这里阅读更多关于它的内容: http : //mywiki.wooledge.org/BashFAQ/031 :
[ ("test" command) and [[ ("new test" command) are used to evaluate expressions. [[ works only in Bash, Zsh and the Korn shell, and is more powerful; [ and test are available in POSIX shells