If 條件運算子:提供未宣告變數時需要一元運算符

If 條件運算子:提供未宣告變數時需要一元運算符

我正在運行下面的腳本,該腳本引發一元運算符問題的錯誤。在主 shell 腳本程式中,我將在下面使用這個existing_sum_check 變量,但無論如何我都想執行此檢查。我怎樣才能避免這個錯誤?

程式:

#!/bin/sh

latest_sum_check=10101;

if [ $latest_sum_check != $EXISTING_SUM_CHECK ]; then
    EXISTING_SUM_CHECK = $latest_sum_check;

    echo $EXISTING_SUM_CHECK;
    echo "Please process";
else
    echo "Do not process"
fi

答案1

你基本上已經有了[ something != $bar ]

如果$bar為空,則變為if [ something != ],這當然不起作用,因為相等測試需要兩個操作數。儘管至少 Bash 的test/[有一種有趣的方式來說明這一點:顯然它會檢查參數的數量,並且由於只有兩個,因此期望第一個是一元運算符。沒有something一個,所以它抱怨。

所以,給變數加上引號

if [ "$latest_sum_check" != "$EXISTING_SUM_CHECK" ]; then ...

這將運行一個EXISTING_SUM_CHECK帶有等號的命令以及來自變數擴展的任何內容作為參數:

 EXISTING_SUM_CHECK = $latest_sum_check;

shell 中的變數賦值不會在它們周圍佔用空格。

答案2

由於存在未宣告的變數 $EXISTING_SUM_CHECK,這是測試的錯誤情況。您應該再進行一次檢查,例如:

if [ -z $EXISTING_SUM_CHECK ]; then
    EXISTING_SUM_CHECK=$latest_sum_check
elif [ $latest_sum_check != $EXISTING_SUM_CHECK ]; then

這使用一元運算來檢查字串的長度是否為零。 != 要求測試兩邊都具有非空值。

解決這個問題的另一種方法可以是:

if [ "X${latest_sum_check}" != "X${EXISTING_SUM_CHECK}" ]; then

如果變數未設定、為 null 或“”,則強制兩個值的值至少為 X。

另請注意,通常如果您要比較兩個數字,建議使用 -ne 而不是 !=,因為 != 是為字串保留的。但是 -ne 僅適用於數字 [0-9],不適用於十六進位比較,例如 md5sum 結果。

相關內容