Linux bash脚本:如果与(conditon)或[条件]一起使用
关于bash脚本中的if语句,我有一个微妙的问题:“if”后面应该有什么类型的括号 我有两条语句,它们现在都在工作,但如果我交换()和[],它们就不工作了 1.比较变量名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 如果将()更改为[],则错误: [
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'