确定输出是字符串还是整数

确定输出是字符串还是整数

我正在尝试编写一个连接到数据库的脚本,然后运行一个返回表中行数的查询。有时数据库或表有问题,它们返回错误而不是整数。例如:
A database connection does not exist
我想确定输出是我想要的整数还是错误。我搜索了各种帖子,但没有一个在我的脚本中起作用。我应该怎么办?

DB2PATH=/bin/db2
$DB2PATH connect to $1 >> /dev/null
count=$($DB2PATH -x " select count(*) from TEST122 ")


if ! [[ "$count" =~ ^[0-9]+$ ]]
then
    echo "string"
else
    echo $count
fi

我用很多不同的方式改变了 if 条件。我用过-eq-ne。它不断返回string。的值为count11。

更新:
printf '%s' "$count" | hexdump -c 输出:

0000000                                       1   1
000000b

答案1

要忽略并修剪数字周围的前导和尾随空格:

if [[ $count =~ ^[[:space:]]*([[:digit:]]+)[[:space:]]*$ ]]; then
  echo number
  count=${BASH_REMATCH[1]}
else
  echo other
fi

或者使用标准sh语法:

trimmed=${count#"${count%%[![:space:]]*}"}
trimmed=${trimmed%"${count##*[![:space:]]}"}
case $trimmed in
  ("" | *[![:digit:]]*) echo other;;
  (*) echo number; count=$trimmed;;
esac

答案2

看起来该变量count有一些额外的不需要的空格,这导致您的条件无法使其成为整数类型。

您需要删除变量中的额外空格来修复它。使用外部工具(例如xargs删除空格)。有用的xargs是它吞噬了变量中的前导空格和尾随空格。

if ! [[ $( xargs <<< "$count" ) =~ ^[0-9]+$ ]]
then
    echo "string"
else
    echo $count
fi

xargs如果不是像使用 shell 本身提供的参数扩展这样的外部工具

if ! [[ "${count// /}" =~ ^[0-9]+$ ]]
then
    echo "string"
else
    echo $count
fi

该语法${count// /}将用空字符串替换所有空格,并且生成的字符串用于与定义的正则表达式进行比较。

答案3

将否定放入表达式中可以得到正确的结果:

if [[ ! "$count" =~ ^[0-9]+$ ]]
then
    echo "string"
else
    echo $count
fi

相关内容