如何解決“預期一元運算子”錯誤?
概述
在本文中,我們將討論如何在 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
結論
我們研究了幾種不同的方法來修復“預期一元運算元”錯誤。
我們首先討論了導致此問題的原因,然後我們研究了不同的解決方法。
我們研究了幾種顯式處理變數未定義情況的方法。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP