Linux bash脚本:如果与(conditon)或[条件]一起使用

Linux bash脚本:如果与(conditon)或[条件]一起使用,linux,bash,shell,Linux,Bash,Shell,关于bash脚本中的if语句,我有一个微妙的问题:“if”后面应该有什么类型的括号 我有两条语句,它们现在都在工作,但如果我交换()和[],它们就不工作了 1.比较变量名 NAME="dada" if [ "$NAME" == "dada" ]; then SOME COMMANDS; fi 如果将[]更改为(),则错误: 2.使用grep if ( grep -q "lalala" mytest.txt ); then SOME COMMANDS; fi 如果将()更改为[],则错误: [

关于bash脚本中的if语句,我有一个微妙的问题:“if”后面应该有什么类型的括号

我有两条语句,它们现在都在工作,但如果我交换()和[],它们就不工作了

1.比较变量名

NAME="dada"
if [ "$NAME" == "dada" ]; then SOME COMMANDS; fi
如果将[]更改为(),则错误:

2.使用grep

if ( grep -q "lalala" mytest.txt ); then SOME COMMANDS; fi
如果将()更改为[],则错误:

[: lalala: binary operator expected
我读过linux手册,其中建议使用[]。那是因为使用grep吗?我们是否可以说如果在if中使用另一个程序,我们应该使用()

关于双引号的附带问题, 是否需要在shell中引用文本?例如,echo“$NAME”或NAME=“fadfaj”

我感到困惑,因为当我尝试使用$NAME加上一些特殊字符,如“\”或空格,我需要在其中使用“\”时,我得到了带“”和不带“”的不同行为

输出

myfolder_na
myfolder\_na

我知道这些都是天真的问题,但我非常感谢你的帮助

如果关键字是命令,则
后面的内容就是命令。执行该命令,如果命令成功(退出时状态为
0
),则条件为true;如果命令失败,则条件为false

虽然它看起来像shell语法,
[
符号实际上是一个命令的名称(它恰好内置在shell中)

[ "$NAME" = "dada" ]
在shell提示下,如果
,则不使用
,它将计算相同的条件并设置
$?
。您还可以执行以下操作:

[ "$NAME" = "dada" ] && echo Yes
]
[
命令的最后一个必需参数。除此之外,
[
命令等同于
测试
命令:

if test "$Name" = "data" ; then echo yes ; fi
请注意,我使用的是
=
而不是
=
。bash中内置的
test
/
[
命令可以识别任何一种形式,但
=
是原始语法,有些实现无法识别
=

[
是与
if
一起使用的最常用命令,但您可以使用任何命令,包括“grep:

if grep -q "lalala" mytest.txt; then SOME COMMANDS; fi
括号是不必要的。(如果添加括号,则使用的是复合命令而不是简单命令;不需要这样做。)

有关详细信息,请参阅bash手册(
info bash

`test'
(带反勾和撇号)以获取内置
test
命令的信息


Bash还有一个
[[
命令,它比旧的
[

有一些优势,非常感谢Keith!你的答案非常清楚!我从来没有想过[如果你没有指出的话,这是一个命令!顺便问一下,你介意对shell中是否使用双引号发表一点评论吗?谢谢!@CrazyFrog,关于引号——除非你有明确和令人信服的理由不引用所有扩展。请看,@CrazyFrog:还有一个变化:使用
=
更安全Bash不是用
[
测试
来识别
=
。Bash可以识别这两种语言,但是
=
是原始语法,一些
[
测试
实现不识别
=
。顺便说一句,POSIX不需要
测试
命令来支持
=/code>作为操作符(一些shell,如bash,支持将其作为扩展),因此使用
=
更安全……顺便说一句,除非您需要括号的效果(创建子shell)。
if(foo)
if foo
慢,因为它派生一个子进程,在该子进程内运行
foo
,然后检查子shell的返回值。这也意味着,与
if cd directory不同,…
——它实际上会更改当前shell中的目录,并根据是否成功执行分支这--
if(cd directory);那么…
实际上不会更改您所在shell的目录,因为它在子进程中执行
cd
,而不是主shell。如果您想要一个没有副作用的分组运算符,那将是大括号,而不是圆括号。因此:
false |{something;something;}
false | | |(某物;某物)更有效
。顺便说一句,不要在一个SO主题中编辑额外的问题。如果您有更多问题,请搜索是否有其他人已经问过,如果没有其他人问过,请单独问。否则,您的问题可能过于宽泛。非常感谢您在shell上提供的其他评论/教程!这对您的帮助和帮助很大可能会使我避免将来的调试!我会小心不要在一篇文章中问多个问题。
if grep -q "lalala" mytest.txt; then SOME COMMANDS; fi
`test'