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

时间:2014-10-15 23:56:32

标签: linux bash shell

我对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

我理解这些是天真的问题,但我非常感谢你的帮助!

1 个答案:

答案 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还有一个[[命令,它比旧版[有一些优势。