/bin/dash: $1이 숫자인지 확인

/bin/dash: $1이 숫자인지 확인

/bin/dash에서 $1이 정수인지 확인하는 가장 좋은 방법은 무엇입니까?

Bash에서는 다음과 같이 할 수 있습니다.

[[ $1 =~ ^([0-9]+)$ ]]

하지만 이는 POSIX와 호환되지 않는 것 같으며 대시는 이를 지원하지 않습니다.

답변1

다음은 정수(양수 또는 음수)를 감지하고 dashPOSIX 모두 및 에서 작동합니다.

옵션 1

echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"

옵션 2

case "${1#[+-]}" in
    ''|*[!0-9]*)
        echo "Not an integer" ;;
    *)
        echo "Integer" ;;
esac

또는 :(nop) 명령을 약간 사용하십시오.

! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer

답변2

, dash, bash, ksh, zshPOSIX sh또는 posh("Bourne 쉘의 재구현" sh) 이 case구조는 가장 널리 사용 가능하고 신뢰할 수 있습니다.

case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac

답변3

-eq문자열 자체뿐만 아니라 문자열도 테스트 할 수 있습니다 .

$ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi' 
dash: 1: [: Illegal number: a
not a number
$ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: 0xa
not a number
$ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
number

오류 메시지에 문제가 있는 경우 오류 출력을 다음으로 리디렉션하세요 /dev/null.

$ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no'
no

답변4

이를 산술 확장으로 사용해 보고 작동하는지 확인하세요. 실제로는 산술 확장이 선행 및 후행 공백 등을 무시하므로 그보다 조금 더 엄격해야 합니다. 따라서 산술 확장을 수행하고 확장된 결과가 원래 변수와 정확하게 일치하는지 확인하십시오.

check_if_number()
{
    if [ "$1" = "$((${1}))" ] 2>/dev/null; then
        echo "Number!"
    else
        echo "not a number"
    fi
}

이는 음수도 허용합니다. 실제로 제외하려면 에 대한 추가 확인을 추가하세요 $((${1} >= 0)).

관련 정보