在shell脚本中用于条件的不同类型的支撑有什么不同的用途?

时间:2012-02-17 20:46:12

标签: shell if-statement conditional

我至少知道在shell脚本中测试条件的4种方法。

  • [ <cond> ];
  • [[ <cond> ]];
  • (( <cond> ));
  • test <cond>;

我想全面了解这些方法之间的区别,以及何时使用哪种方法。

我尝试在网上搜索摘要,但没有找到任何体面的东西。在某个地方有一个像样的清单会很棒(堆栈溢出来救援!)。

2 个答案:

答案 0 :(得分:1)

在链接here的网站上,如果向下滚动到[特殊字符,您会看到[[的单独条目,其中包含对两者之间差异的讨论的链接他们。还有((以下的条目。希望有所帮助!

答案 1 :(得分:1)

我们在这里描述一下。

首先,基本上有3种不同的测试方法

  • [ EXPRESSION ],与test EXPRESSION
  • 完全相同
  • [[ EXPRESSION ]]
  • (( EXPRESSION )),与let "EXPRESSION"
  • 完全相同

让我们进入细节:

test

这是测试命令的祖父。即使你的shell不支持它,几乎每个unix系统上仍然有一个/usr/bin/test命令。所以调用test将运行内置函数或二进制文件作为回退。输入$ type test以查看使用的版本。同样适用于[

在大多数基本情况下,这应该足以进行测试。

if [ "$a" = test -o "$a" = Test ];
if test "$a" = test -o "$a" = Test;

如果你需要更多的力量,那么......

[[]]

这是一个特殊的bash。并非每个sh​​ell都需要支持这一点,并且没有二进制回退。它提供了更强大的比较引擎,特别是pattern matching和正则表达式匹配。

if [[ "$a" == [Tt]es? ]]; # pattern
if [[ "$a" =~ ^[Tt]es.$ ]]; # RE

(())

这是用于算术表达式的bash特殊值,如果计算结果非零,则为true。并非每个sh​​ell都需要支持这一点,并且没有二进制回退。

if (( x * (1 + x++) ));
if let "x * (1 + x++)";

请注意,在引用$(( ... ))中的变量时,您可以省略let符号。