我一直在找那个地方,但找不到答案。 在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];然后
但不像上面那个。
任何帮助都将不胜感激。
答案 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
,这会使代码更清晰。