3

我在 KornShell (ksh) 上得到以下代码段失败:

var1="1"
var2="2"
if [ ( "$var1" != "" -o "$var2" != "") -a ( "$var1" = "$var2" -o " "$var1" = "x") ]; then
   echo "True"
else
   echo "False"
fi

ksh: 语法错误: `"$var1"' 意外

据我了解,这失败了,因为括号在无法识别 var1 的子shell中运行。那么如何在方括号内分组条件集呢?

注意我已经知道以下解决方案并且不想使用它们:

  • 将条件放在单独的嵌套 if 语句中。
  • 优化/重新排列条件,以便仅将它们放在一组中。
4

2 回答 2

5

你在找这个吗?

#!/bin/ksh

if [[ -n $1 || -n $2 ]] && [[ $1 == "$2" || $1 == x ]]; then
        echo "True"
else
        echo "False"
fi

跑:

$ ./if.sh "" ""
False

$ ./if.sh 1 2
False

$ ./if.sh 1 1
True

$ ./if.sh x 2
True

如果您想知道为什么您的代码会失败:

  1. 您需要转义括号\(
  2. 括号周围必须有一个空格
  3. 你有一个错字,有一个多余的"浮动

所以这 ...

if [ ( "$var1" != "" -o "$var2" != "") -a ( "$var1" = "$var2" -o " "$var1" = "x") ]; then
                                                         typo ---^              ^
                                     ^------------------ missing spaces --------^

……应该是这样的……

if [ \( "$var1" != "" -o "$var2" != "" \) -a \( "$var1" = "$var2" -o "$var1" = "x" \) ]; then

然后它将起作用。

于 2013-04-29T19:13:15.427 回答
0

您需要使用双方括号.. [[--------]]

希望能帮助到你。

问候。

于 2013-11-18T21:58:41.450 回答