比较从剪切中获得的数字的 Bash 脚本

比较从剪切中获得的数字的 Bash 脚本

我有一个像这样的字符串

"Hello catch these numbers 20 30"

我有:

NUMBER_ONE=$(echo "$line" | cut -d' ' -f5)
NUMBER_TWO=$(echo "$line" | cut -d' ' -f6)

当我比较时if [ "$NUMBER_ONE" -gt "$NUMBER_TWO" ];出现错误,它需要一个整数表达式。我该如何解决?

答案1

假设变量line包含确切地你所显示的,那么$NUMBER_TWO将是30",包括双引号。这显然不是一个整数。

反而,

line='"Hello catch these numbers 20 30"'

if [[ $line =~ ([[:digit:]]+)" "([[:digit:]]+) ]]; then
    NUMBER_ONE=${BASH_REMATCH[1]}
    NUMBER_TWO=${BASH_REMATCH[2]}

    if (( NUMBER_ONE > NUMBER_TWO )); then
        echo NUMBER_ONE is greater than NUMBER_TWO
    else
        echo NUMBER_ONE is not greater than NUMBER_TWO
    fi
fi

这使用正则表达式将两个空格分隔的(正)整数匹配为数字的子字符串,然后执行比较。后面的双引号30不会被匹配。


如果您仍然想使用标准工具箱中的工具,则只需在分配变量时使用 删除变量中的所有非数字即可tr。稍微修改一下你的旧代码:

NUMBER_ONE=$(cut -d' ' -f 5 <<<"$line" | tr -dc '[:digit:]' )
NUMBER_TWO=$(cut -d' ' -f 6 <<<"$line" | tr -dc '[:digit:]' )

或者事后使用替代品来做bash

NUMBER_ONE=$(cut -d' ' -f 5 <<<"$line" ); NUMBER_ONE=${NUMBER_ONE//[![:digit:]]/}
NUMBER_TWO=$(cut -d' ' -f 6 <<<"$line" ); NUMBER_TWO=${NUMBER_TWO//[![:digit:]]/}

请注意,如果您需要处理负整数,那么您显然不应该去掉减号(并且在上面第一个代码片段中的正则表达式匹配中,您也必须允许初始减号)。

答案2

尝试使用下面的脚本,它也有效

NUMBER_ONE=`sed 's/"//g'  o.txt| awk '{print $(NF-1)}'`
NUMBER_TWO=`sed 's/"//g'  o.txt| awk '{print $NF}'`

if [[ $NUMBER_ONE -gt $NUMBER_TWO ]]; 
then 
echo "$NUMBER_ONE is greater than NUMBER_TWO"; 
else 
echo "NUMBER_ONE is equal or less than NUMBER_TWO";


fi

相关内容