我正在尝试编写一个连接到数据库的脚本,然后运行一个返回表中行数的查询。有时数据库或表有问题,它们返回错误而不是整数。例如:
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
。的值为count
11。
更新:
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