Unix-条件中的条件

Unix-条件中的条件,unix,ksh,Unix,Ksh,我到处找了,但找不到答案。 在ksh中,您如何执行以下操作: while [ [ ! [ [ -n $var1 ] || [ [ -n $var2 ] && [ -n $var3 ] ] ] ] && [ ! [ [ -n $var1 ] && [ -n $var2 ] ] ] ]; do ...etc etc done 或者以伪/更容易看到的方式 while ((! ((var1 != none) or ((var2

我到处找了,但找不到答案。 在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];然后

但和上面的不一样


任何帮助都将不胜感激。

您希望执行的测试存在许多问题

  • 如果
    $var
    为空,像
    -n$var
    这样的片段将失败,因为它将扩展为单个
    -n
使用
-n“$var”
是这里的防弹版本

  • -a
    运算符表示,而不是
    和&

  • -o
    运算符表示,而不是
    |

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

应用此规则,您的表达式将更接近如下所示:

[ ! ( -n "$var1" -o ( -n "$var2" -a -n "$var3" ) ) -a ! ( -n "$var1" -a -n "$var2" ) ]
[ ! '(' -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" ) ]
[ ! '(' -n "$var1" -o '(' -n "$var2" -a -n "$var3" ')' ')' -a ! '(' -n "$var1" -a -n "$var2" ')' ]
请注意,
[
是一个可执行文件,通常位于
/usr/bin/
中,因此不同shell之间没有任何语法差异


使用不同的shell时,只需注意不同的元字符。

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

[[ ! ( -n $var1 && ( -n $var2 || -n $var3 ) ) ]]
此外,您不需要在
[[]]
中使用双引号
$var
,这将使代码更加清晰