Linux

確定輸出是字元串還是整數

  • October 31, 2018

我正在嘗試編寫一個連接到數據庫的腳本,然後執行一個返回表中行數的查詢。有時數據庫或表有問題,而不是整數,它們返回錯誤。例如:

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

看起來該變數count有一些額外的不受歡迎的空格,這導致您的條件無法使其成為整數類型。

您需要去掉變數中的額外空格來修復它。使用外部工具xargs,例如刪除空格。有用的xargs是它吞噬了變數中的前導和尾隨空格。

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

如果不是外部工具,例如xargs使用外殼本身提供的參數擴展

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

該語法${count// /}將用空字元串替換所有空格,並將結果字元串用於與定義的正則表達式進行比較。

要忽略和修剪數字周圍的前導和尾隨空格:

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

引用自:https://unix.stackexchange.com/questions/478831