0

我一直在到处寻找,但找不到答案。在 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)))) {
....
}

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

我在 if [ -z $var1 ] && [ -n $var2 ]; 等简单条件下发现了很多。然后

但不像上面那个。

任何帮助,将不胜感激。

4

2 回答 2

1

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

  • 如果为空,片段 like -n $var将失败,$var因为它将扩展为单个-n.

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

  • 并且-a运算符not with表示&&

  • or-o运算符not with表示||

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

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

[ ! ( -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时,您只需要注意不同的元字符。

于 2013-04-05T11:03:31.397 回答
1

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

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

此外,您不需要双引号$var[[ ]]这会使代码更清晰。

于 2013-04-05T12:01:12.847 回答