/bin/dash에서 $1이 정수인지 확인하는 가장 좋은 방법은 무엇입니까?
Bash에서는 다음과 같이 할 수 있습니다.
[[ $1 =~ ^([0-9]+)$ ]]
하지만 이는 POSIX와 호환되지 않는 것 같으며 대시는 이를 지원하지 않습니다.
답변1
다음은 정수(양수 또는 음수)를 감지하고 dash
POSIX 모두 및 에서 작동합니다.
옵션 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
, zsh
POSIX 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))
.