Linux脚本在两个服务器上的ksh上表现不同

时间:2015-02-11 09:40:26

标签: linux ksh

下面的代码块来自Linux脚本。它在具有相同操作系统的不同Linux服务器中提供不同的输出。

SECURE="YES"
if [[ !((-n "$SECURE") && (( "$SECURE" == "YES") || ("$SECURE" == "NO"))) ]]
then        
  echo -e "Validation failed for varilable SECURE: $SECURE"
else
  echo "Validation passed"
fi

Server-1输出:

  

可变量安全验证失败:是

Server-2输出:

  

验证通过

不确定为什么输出不同。任何有关此的细节都会有所帮助。感谢。

更新: 我在两个服务器中添加了#!/bin/bash作为第一行,并且它们提供了与#34相同的输出;验证通过"。

当我添加#!/bin/ksh时,我得到:

Server-1输出:

  

可变量安全验证失败:是

Server-2输出:

  

语法错误:`!(( - n" $ SECURE")&&((" $ SECURE" ==" YES")|| (" $ SECURE" ==" NO")))'缺少表达式运算符

默认情况下,两台服务器都使用ksh。调用此命令:

env | grep SHELL 

所示:

SHELL=/bin/ksh

但为什么输出不同?

更新2: 我发现KSH版本在两台服务器上有所不同。一台服务器有pdksh而另一台服务器有ksh93。任何人都可以告诉我这两个版本之间的区别吗?

1 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,但是......

我认为KSH-93 Frequently Asked Questions - Q17有一个简短的答案。

  

Q17。什么是pdksh,是否与ksh或KornShell有关?

     

A17。 pdksh是UNIX shell的公共域版本     与ksh无关。它支持1988年KornShell语言的大部分内容   功能和1993年的一些功能。 一些KornShell脚本会   不能用pdksh 运行。

现在,根据ksh88的手册,te OP的脚本应该有效。也许解析器期望运营商之间的空间,甚至他可能发现了一个错误。

无论如何,这应该适用于两个版本(即使使用SECURE=""):

SECURE="YES"
if [[ "$SECURE" == "YES" || "$SECURE" == "NO" ]]
then
  echo "Validation passed"
else
  echo "Validation failed for varilable SECURE: '$SECURE'"
fi