데이터베이스에 연결한 다음 테이블의 행 수를 반환하는 쿼리를 실행하는 스크립트를 작성하려고 합니다. 때로는 데이터베이스나 테이블에 문제가 있어 정수 대신 오류를 반환하는 경우도 있습니다. 예:
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