如何解决“预期一元运算符”错误?


概述

在本文中,我们将讨论如何在 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+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告