我对bash脚本中的if语句有一个微妙的问题:“if”后面应该使用什么类型的括号?
我有两个声明现在都在工作,但如果我交换()和[]。
则无法正常工作1.比较变量名
NAME="dada"
if [ "$NAME" == "dada" ]; then SOME COMMANDS; fi
如果将[]更改为(),则错误:
dada: command not found
2.使用grep
if ( grep -q "lalala" mytest.txt ); then SOME COMMANDS; fi
如果将()更改为[],则错误:
[: lalala: binary operator expected
我读了linux的人,建议使用[]。那是因为使用grep吗?如果我们在内部使用另一个程序,我们是否应该使用()?
关于双引号的附带问题, 是否有必要在shell中引用文本?例如,echo“$ NAME”或NAME =“fadfaj”?
我感到很困惑,因为当我尝试使用$ NAME加上一些特殊字符(如“_”或空格)时,我需要使用“\”,无论是否使用“”,我都会有不同的行为。
NAME="myfolder"
echo $NAME\_na
echo "$NAME\_na"
输出
myfolder_na
myfolder\_na
我理解这些是天真的问题,但我非常感谢你的帮助!
答案 0 :(得分:1)
if
关键字后面的内容是命令。执行该命令,如果命令成功(状态为0
退出),则条件为true;如果失败则返回false。
虽然它看起来像shell语法,但[
符号实际上是命令的名称(恰好是内置在shell中)。例如,您可以输入
[ "$NAME" = "dada" ]
在shell提示符下,没有if
,它将评估相同的条件并设置$?
。你也可以这样做:
[ "$NAME" = "dada" ] && echo Yes
]
是[
命令的必需最后一个参数。除了该要求之外,[
命令等同于test
命令:
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还有一个[[
命令,它比旧版[
有一些优势。