我有一个像这样的字符串
"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