如何解决“预期一元运算符”错误?
概述
在本文中,我们将讨论如何在 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
结论
我们研究了几种不同的方法来修复“预期一元操作数”错误。
我们首先讨论了导致此问题的原因,然后我们研究了不同的解决方法。
我们研究了几种显式处理变量未定义情况的方法。