出力が文字列か整数かを確認する

出力が文字列か整数かを確認する

データベースに接続し、テーブルの行数を返すクエリを実行するスクリプトを作成しようとしています。時にはデータベースやテーブルに問題があり、整数の代わりにエラーを返すことがあります。例:
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シェル自体が提供するパラメータ拡張などの外部ツールを使用する代わりに

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

この構文は${count// /}すべての空白を空の文字列に置き換え、結果の文字列は定義された正規表現と比較するために使用されます。

答え3

式に否定を入れると、正しい結果が得られます。

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

関連情報