首页 > 解决方案 > 为什么我会收到这个一元运算符预期的错误?

问题描述

我有一个 bash 脚本,我从字符串中获取一个数字并使用 bash 中的 expr 命令将其转换为 INT。然后我想看看第一个数字是否大于第二个数字。当我运行脚本时,我得到:unary operator expected

我的脚本是:

#!/bin/bash

name1="19.5"
name2="19.1"
name3=`expr $name1`
name4=`expr $name2`

if [ $name3 >= $name4 ]; then
    echo "${name3} is greater than ${name4}"
fi

我究竟做错了什么?我没有正确地将字符串编号转换为 INT 吗?

标签: bash

解决方案


>是重定向标准输出的操作符。因此,您试图将]命令的标准输出重定向到一个名为 的文件=,该文件只留下[两个参数($name3 和 $name4)。

因此,如果要进行文本[比较,则必须使用代替[[ ... ]],这不是命令,而是 bash语法的一部分,并且在括号之间,重定向规则不适用。但是,您仍然没有<=作为运算符,而只有<and >。在你的情况下,这将是

if [[ ! $name4 < $name3 ]]; then ....

如果你想比较浮点数,并坚持使用 bash,你可以使用bc并做

if [[ $(bc <<< "$name3 <=  $name4") == 1 ]]; then

或者你用 zsh 而不是 bash 编写完整的 shell 脚本,然后免费获得浮点运算:

if (( name3 >= name4 )); then  # zsh only!

推荐阅读