2013-04-05 36 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一起使用時,您只需注意不同的元字符。