Linux
確定輸出是字元串還是整數
我正在嘗試編寫一個連接到數據庫的腳本,然後執行一個返回表中行數的查詢。有時數據庫或表有問題,而不是整數,它們返回錯誤。例如:
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
看起來該變數
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