データベースに接続し、テーブルの行数を返すクエリを実行するスクリプトを作成しようとしています。時にはデータベースやテーブルに問題があり、整数の代わりにエラーを返すことがあります。例:
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
シェル自体が提供するパラメータ拡張などの外部ツールを使用する代わりに
if ! [[ "${count// /}" =~ ^[0-9]+$ ]]
then
echo "string"
else
echo $count
fi
この構文は${count// /}
すべての空白を空の文字列に置き換え、結果の文字列は定義された正規表現と比較するために使用されます。
答え3
式に否定を入れると、正しい結果が得られます。
if [[ ! "$count" =~ ^[0-9]+$ ]]
then
echo "string"
else
echo $count
fi