Unix - 条件内的条件

时间:2013-04-05 10:17:44

标签: unix ksh

我一直在找那个地方,但找不到答案。 在ksh中,你如何做这样的事情:

while [ [ ! [ [ -n $var1 ] || [ [ -n $var2 ] && [ -n $var3 ] ] ] ] && [ ! [ [ -n $var1 ] && [ -n $var2 ] ] ] ]; do
    ...etc etc
done

或以伪/更简单的方式查看

while ((! ((var1 != none) or 
         ((var2 != none) and (var3 != none)))
      and
      (!((var1 != none) and (var2 != none)))) {
....
}

......基本上是任何分组的条件

我在很简单的条件下找到了很多     如果[-z $ var1]&& [-n $ var2];然后

但不像上面那个。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您要执行的测试存在许多问题。

    如果-n $var为空,
  • $var之类的片段将会失败,因为它会扩展为单个-n

此处使用-n "$var"代替防弹版。

  • 表示为-a运算符 &&

  • 表示为-o运算符 ||

  • 分组运算符为()而不是另一个嵌套[]构造

应用此规则,您的表达式将更接近于:

[ ! ( -n "$var1" -o ( -n "$var2" -a -n "$var3" ) ) -a ! ( -n "$var1" -a -n "$var2" ) ]

请注意,在此使用空格必需

根据转义规则,您可能必须转义()

由于我不知道在ksh中如何处理这些问题,我无法确定是否真的有必要,但所有shell证明版本看起来都是这样的:

[ ! '(' -n "$var1" -o '(' -n "$var2" -a -n "$var3" ')' ')' -a ! '(' -n "$var1" -a -n "$var2" ')' ]

请注意[是一个通常位于/usr/bin/的可执行文件,因此不同shell之间没有任何语法差异。

在将[与不同的shell一起使用时,您必须注意不同的元字符。

答案 1 :(得分:1)

使用ksh的{​​{1}}语法要容易得多。 [[ ]](不需要引用,您可以像使用C语言一样使用)&&。例如:

||

此外,您无需在[[ ! ( -n $var1 && ( -n $var2 || -n $var3 ) ) ]] 内双引$var,这会使代码更清晰。