如果构造不需要括号?

时间:2014-11-03 23:55:06

标签: linux bash if-statement grep brackets

我正在为shell脚本类做一些功课,并且有一个问题要求我编写一个脚本来测试输入的参数是否是一个有效的shell变量名。下面的脚本似乎工作正常。

if echo "$1" | grep -v ".*[^A-Za-z_]" > /dev/null
then
        echo yes
else
        echo no
fi

我理解括号是BASH shell中测试功能的简写。我的问题是,当我使用括号尝试上述脚本时出现错误。

if [ echo "$1" | grep -v ".*[^A-Za-z_]" > /dev/null ]

这个问题(我相信)是grep试图使用]作为其参数,因此在运行脚本时会导致错误。

在什么情况下我不需要括号?

3 个答案:

答案 0 :(得分:4)

[实际上是一个命令(它恰好构建在大多数shell中),而不仅仅是if语句的一部分语法。

if语句执行作为其参数的命令。如果该命令成功(将$?设置为零),则条件为真;如果失败(将$?设置为某个非零值),则条件为false。

内置[命令几乎完全等同于test命令;区别在于[需要]作为其最后一个参数。

另见https://unix.stackexchange.com/a/22728/10454

答案 1 :(得分:2)

正如你所说,

[ / test是一个命令(也是一个内置的)。它是一个接受特定排序的参数的命令,并且在给定这些参数的情况下以特定方式运行。

它接受标志和比较运算符,并对其进行操作以获得truefalse结果。然后它将该结果转换为返回代码。 0true1false

定义了shell中的if构造

  

如果列表;然后列出; [elif list;然后列出; ] ... [else list; ] fi

     

执行if列表。如果其退出状态为零,则执行then列表。否则,依次执行每个elif列表,如果其退出状态为零,则执行相应的列表并完成命令。否则,执行else列表(如果存在)。退出状态是执行的最后一个命令的退出状态,如果没有条件测试为真,则为零。

因此当[ / test返回if评估的退出代码时。

您在[命令/管道周围不需要(并且无法使用)echo的原因是因为{{1}不是有效的{{1}参数。相反,它本身就是一个命令[,因此不需要list进行评估。您可以直接使用它,并将管道的返回代码交给[进行评估。

答案 2 :(得分:1)

您也可以使用双方括号[[代替单[

在此处详细了解: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