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

标签 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 输出:

Validation failed for varilable SECURE: YES

服务器 2 输出:

Validation passed

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

更新: 我在两台服务器中都添加了 #!/bin/bash 作为第一行,它们给出了与“验证通过”相同的输出。

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

Server-1 输出:

Validation failed for varilable SECURE: YES

服务器 2 输出:

syntax error: `!( ( -n "$SECURE" ) && ( ( "$SECURE" == "YES" ) || ( "$SECURE" == "NO" )))' missing expression operator

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

env | grep SHELL 

显示:

SHELL=/bin/ksh

但为什么输出不同呢?

更新 2: 我发现两台服务器的 KSH 版本不同。一台服务器有 pdksh,另一台有 ksh93。谁能告诉我这两个版本之间的区别?

最佳答案

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

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

Q17. What is pdksh and is it related to ksh or KornShell?

A17. pdksh is a public domain version of a UNIX shell that is unrelated to ksh. It supports most of the 1988 KornShell language features and some of the 1993 features. Some KornShell scripts will not run with 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

关于Linux 脚本在两台服务器的 ksh 上表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28450985/

相关文章:

linux - 内存充足的 Oom-killer(内存不足)(?!) - inotify

linux - udev monitor 在没有轮询的情况下很慢

java - 在 Linux 上将 MSword 转换为 XML/HTML

c++ - 在使用 gpp 编译器包编译和运行 c++ 文件后,Atom 正在主目录中创建一个 filename.o

bash - 在Linux脚本中,是否可以在同一个进程中执行多个命令?

c++ - 如何加快程序的启动速度

shell - 如何检查声音是否在我的声卡上停止播放

linux - Grep(或替代)2个字符串,匹配一个,另一个或两者都成功,包含任何其他内容是失败的

unix - 每行打印一个字

linux - 如何检测脚本中的 DDL 语句并退出