출력이 문자열인지 정수인지 확인

출력이 문자열인지 정수인지 확인

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

관련 정보