2013-04-05 88 views
0

我一直在寻找到处都找不到答案。 在KSH,你怎么做这样的事情:Unix - 条件内的条件

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]。然后

而不是像上面的。

任何帮助,将不胜感激。

回答

1

使用ksh[[ ]]语法要容易得多。不需要引用(),您可以像在C语言中一样使用&&||。例如:

[[ ! (-n $var1 && (-n $var2 || -n $var3)) ]] 

而且,你并不需要加倍内[[ ]]报价$var这将使得代码更干净。

1

有许多与你要进行测试的问题。

  • -n $var片段将失败$var是空的,因为它会被扩展到单个-n

使用-n "$var"取而代之的是这里的防弹版本。

  • 表示与操作者-a&&

  • 表示与操作者-o||

  • 分组经营者()不是另一个嵌套[]构建

运用这一规则,你的表情会更接近寻找类似的东西:

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

注意,使用的空间是强制性这里。

根据转义规则,你可能有逃避()

由于我不知道如何将这些被处理的ksh我不能告诉肯定,如果真的有必要存在,但所有的外壳证据看起来会像:

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

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

[与不同的shell一起使用时,您只需注意不同的元字符。