如何解決“預期一元運算子”錯誤?


概述

在本文中,我們將討論如何在 Linux 中解決“預期一元運算子”錯誤。這是在使用 Linux 時可能遇到的最常見錯誤之一。在這篇文章中,我們將瞭解如何修復它以及導致此錯誤的可能原因。

什麼是“預期一元運算子”?

“預期一元運算子”是一種語法錯誤,當表示式只有一個運算元時發生。例如:

int x 5; //error - unary operator expected

上面的程式碼片段顯示錯誤,因為兩個變數之間沒有二元運算(運算子)。因此,如果您的程式中存在此類錯誤,則需要檢查程式中所有表示式是否至少有兩個運算元。

導致錯誤的原因是什麼?

讓我們首先編寫一個輔助函式,該函式檢查使用者輸入的數字是否等於 1。

$ cat unity_check.sh
#! /bin/bash
read -p "Enter the input: " num1
if [ $num1 -eq 1 ]
then
   echo "Number entered is 1"
else
   echo "Not equal to One !!"
fi

編寫指令碼後,我們需要對其進行測試。

$ ./unity_check.sh
Enter the input: 5
Not equal to One !!

到目前為止一切順利!讓我們看看我們是否可以處理使用者按下“回車”鍵而不輸入任何文字的情況。

$ ./unity_check.sh
Enter the input:
./unity_check.sh: line 3: [: -eq: unary operator expected
Not equal to One !!

讓我們逐步檢查程式碼以找出它為什麼不起作用。

$ bash -xv ./unity_check.sh
#! /bin/bash
read -p "Enter the input: " num1
+ read -p 'Enter the input: ' num1
Enter the input:
if [ $num1 -eq 1 ]
then
   echo "Number entered is 1"
else
   echo "Not equal to One !!"
fi
+ '[' -eq 1 ']'
./unity_check.sh: line 3: [: -eq: unary operator expected
+ echo 'Not equal to One !!'
Not equal to One !!

我們可以從除錯日誌中看到 if 語句計算結果為真。

if [ -eq 1 ]

由於變數中的值為空,比較表示式的其中一側消失了。結果,我們現在只處理等於 (=) 運算子的一個引數。因此,Bash 抱怨“預期一元運算子”。

透過引用變數來防止錯誤

為了避免單詞分割,我們可以對變數使用雙引號。因此,讓我們更新我們最初的 bash 指令碼:

$ cat unity_check.sh
#! /bin/bash
read -p "Enter the input: " num1
if [ "$num1" -eq 1 ]
then
   echo "Number entered is 1"
else
   echo "Not equal to One !!"
fi

在這裡,我們用“$num1”替換了$num1。現在讓我們執行我們的測試:

$ ./unity_check.sh
Enter the input: 1
Number entered is 1

當沒有任何輸入時,它通常可以正常工作。讓我們再次檢查空輸入:

$ ./unity_check.sh
Enter the input:
./unity_check.sh: line 3: [: : integer expression expected
Not equal to One !!

在這裡,我們收到“預期 int 表示式”訊息。讓我們除錯指令碼:

$ bash -xv ./unity_check.sh
#! /bin/bash
read -p "Enter the input: " num1
+ read -p 'Enter the input: ' num1
Enter the input:
if [ "$num1" -eq 1 ]
then
   echo "Number entered is 1"
else
   echo "Not equal to One !!"
fi
+ '[' '' -eq 1 ']'
./unity_check.sh: line 3: [: : integer expression expected
+ echo 'Not equal to One !!'
Not equal to One !!

我們可以從除錯輸出中看到 if 語句計算結果為真。

if [ '' -eq 1 ]

而且,我們正在比較蘋果和橙子!我們收到此警告是因為我們使用“eq”運算子來檢查兩個字串是否相等。但是,“eq”運算子僅用於檢查整數。要檢查兩個字串是否等效,我們應該改為使用“=”運算子。因此,讓我們更改程式碼並再次嘗試:

$ cat unity_check.sh
#! /bin/bash
read -p "Enter the input: " num1
if [ "$num1" = 1 ]
then
   echo "Number entered is 1"
else
   echo "Not equal to One !!"
fi
$ ./unity_check.sh
Enter the input: 3
Not equal to One !!

$ ./unity_check.sh
Enter the input: 1
Number entered is 1

$ ./unity_check.sh
Enter the input:
Not equal to One !!

它適用於所有測試用例。

使用雙括號語法來防止錯誤

我們可以在 Bash 中使用 [[ 結構來檢查表示式是否計算結果為真或假。

使用雙括號語法時,bash 在執行擴充套件時不會分割單詞。這意味著它對變數可能未設定的情況更容忍。

讓我們修改我們的指令碼:

$ cat unity_check.sh
#! /bin/bash
read -p "Enter the input: " num1
if [[ $num1 -eq 1 ]]
then
   echo "Number entered is 1"
else
   echo "Not equal to One !!"
fi

現在讓我們針對空輸入執行我們的測試用例。

$ ./unity_check.sh
Enter the input:
Not equal to One !!

太好了!它按預期工作。

處理未定義變數的情況

我們已經在前面部分介紹了一些防止“預期一元運算子”錯誤訊息的方法。現在讓我們看看一些處理未定義變數的方法。

為變數分配預設值

如果我們不定義變數,我們可以為其賦予預設值:

$ cat unity_check.sh
#! /bin/bash
read -p "Enter the input: " num1
if [ "${num:-1}" -eq 1 ]
then
   echo "Number entered is 1"
else
   echo "Not equal to One !!"
fi

在這裡,${#num:-1} 語法確保如果未定義 $num 變數,則其值將作為 1(預設值)採用。我們可以透過進行一些測試來驗證它:

$ ./unity_check.sh
Enter the input: 4
Not equal to One !!

$ ./unity_check.sh
Enter the input:
Number entered is 1

使用 -z 一元運算子

您還可以使用 -z 運算子來檢查引數是否為空。

$ cat unity_check.sh
#! /bin/bash
read -p "Enter the input: " num1
if [ -z "$num1" ]
then
   echo "The number is empty"
   exit 0
fi
if [ "${num1}" -eq 1 ]
then
   echo "Number entered is 1"
else
   echo "Not equal to One !!"
fi

如果變數的值為空,則我們打印出相關語句並終止指令碼。

$ ./unity_check.sh
Enter the input:
The number is empty

結論

我們研究了幾種不同的方法來修復“預期一元運算元”錯誤。

我們首先討論了導致此問題的原因,然後我們研究了不同的解決方法。

我們研究了幾種顯式處理變數未定義情況的方法。

更新於:2022年12月26日

8K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.