2015-02-11 62 views
1

下面的代碼塊來自Linux腳本。它在具有相同OS的不同Linux服務器上提供不同的輸出。Linux腳本在兩臺服務器上的ksh上表現不同

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

服務器-1輸出:

Validation failed for varilable SECURE: YES

服務器2輸出:

Validation passed

不知道爲什麼輸出是不同的。有關這方面的任何細節都會有幫助。謝謝。

更新: 我在兩臺服務器中都添加了#!/bin/bash作爲第一行,它們的輸出與「驗證通過」相同。

當我添加#!/bin/ksh我得到:

服務器-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。任何人都可以告訴我兩個版本之間的區別嗎?

+1

如果添加後'的空間會發生什麼'? – choroba 2015-02-11 09:59:30

+0

您應該在兩臺服務器上得到相同的答案。也許是一個錯字?使用'#!/ bin/bash' shebang將其作爲腳本,將其複製到服務器,並且它應該可以工作。你的邏輯真的很複雜:爲什麼不簡單地使用'if [[$ SECURE = @(YES | NO)]];然後回顯「驗證通過」; else printf'變量驗證失敗SECURE:%q \ n'「$ SECURE」; fi'? – 2015-02-11 10:04:52

+0

你有沒有檢查版本,它們在兩臺服務器上都是一樣的嗎? – alijandro 2015-02-11 10:56:20

回答

0

我知道這是一個老問題,但...

我認爲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的腳本應該已經工作。也許解析器期望操作員之間有空間,甚至他可能發現了一個錯誤。

無論如何,這應該在兩個版本(甚至SECURE="")工作:

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