我正在運行下面的腳本,該腳本引發一元運算符問題的錯誤。在主 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 結果。