通常,我在if语句中使用方括号:
if [ "$name" = 'Bob' ]; then ...
但是,当我检查是否grep
成功时,不使用方括号:
if grep -q "$text" $file ; then ...
if
声明中什么时候需要方括号?
通常,我在if语句中使用方括号:
if [ "$name" = 'Bob' ]; then ...
但是,当我检查是否grep
成功时,不使用方括号:
if grep -q "$text" $file ; then ...
if
声明中什么时候需要方括号?
Answers:
方括号是test
命令的同义词。一条if
语句检查命令的退出状态,以便决定采用哪个分支。grep -q "$text"
是命令,但"$name" = 'Bob'
不是-它只是一个表达式。test
是一个命令,它接受一个表达式并对其求值:
if test "$name" = 'Bob'; then ...
由于方括号是test
命令的同义词,因此您可以将其重写为原始语句:
if [ "$name" = 'Bob' ]; then ...
if $boolean_var ; then ...
不需要括号?
$boolean_var
的值为“ true”或“ false”,则可以运行该命令 ,因为您正在运行命令true
或false
。
if $boolean_var ; then ...
如果$ boolean_var为0
或1
,则无法正常工作,请参见man true
和man false
。
0
,并1
在你的命令$PATH
-但是这将是丑陋的。
[
实际上是一个命令,等同于该test
命令(几乎见下文)。它不是shell语法的一部分。([
和test
,这取决于外壳,通常也是内置命令,但这不会影响它们的行为,除非可能是为了提高性能。)
一个if
语句执行的命令和执行then
如果命令成功的一部分,或者else
一部分(如果有的话),如果它失败。(如果命令以状态($?
)为0退出,则成功;如果以非零状态退出,则失败。)
在
if [ "$name" = 'Bob' ]; then ...
命令是
[ "$name" = 'Bob' ]
(您可以直接执行同一命令,而无需使用if
。)
在
if grep -q "$text" $file ; then ...
命令是
grep -q "$text" $file
man [
或man test
了解更多信息。
脚:嗯,该[
命令几乎等同于该test
命令。区别在于,[
要求]
以其作为最后一个参数,而test
实际上并不允许-(更确切地说,test
不对]
参数进行特殊处理;例如,它可以是有效的文件名)。(不必以这种方式实施,但是如果[
没有匹配项,]
就会使很多人非常紧张。)
nervous
参数。
[ ... ]
考虑语法的最佳方法是考虑[
成为一个程序-它就是它!
看一下这个:
~ $ ls /usr/bin/\[
/usr/bin/[
另一方面,您可能没有使用该版本,因为bash
它还提供了[
作为内置的shell。
无论如何,要回答您的问题:什么if
是运行您给它的命令,并查看它的返回值是否是0
。您[
可以进行其他更有趣的比较,例如字符串比较。请参阅man [
和man bash
。
[
是在内部实现的,我认为这[[
就是要实现的。
[
是内置的。这就是为什么builtin [
。[[
与有所不同[
,它做不同的事情。
bash
手册页的SHELL BUILTIN COMMANDS下查看。test expr
并[ expr ]
一起列出。
type -a [
help '['