Bash에서 변수가 숫자인지 어떻게 테스트합니까?


598

스크립트에 전달 된 인수가 숫자인지 확인하는 방법을 알 수 없습니다.

내가하고 싶은 것은 다음과 같습니다.

test *isnumber* $1 && VAR=$1 || echo "need a number"

어떤 도움?


17
옆으로- test && echo "foo" && exit 0 || echo "bar" && exit 1사용중인 접근 방식에 의도하지 않은 부작용이있을 수 있습니다-에코가 실패하면 (아마도 출력이 닫힌 FD에 출력됩니다) exit 0건너 뛰고 코드는 시도합니다 echo "bar". 그것도 실패하면 &&조건이 실패하고 심지어 실행되지 않습니다 exit 1! / if대신 실제 명령문을 사용하면 예기치 않은 부작용이 적습니다. &&||
Charles Duffy

@CharlesDuffy 그것은 대부분의 사람들이 털이 많은 버그를 추적해야 할 때만 얻을 수 있다는 정말 영리한 생각입니다 ...! 에코가 실패를 반환 할 수 있다고 생각한 적이 없습니다.
Camilo Martin

6
파티에 조금 늦었지만, 얼마 전에 찰스가 겪었던 위험에 대해서도 알고 있습니다. 따라서 여기에 100 % 바보 (그리고 잘 읽을 수있는) 줄이 있습니다. [[ $1 =~ "^[0-9]+$" ]] && { echo "number"; exit 0; } || { echo "not a number"; exit 1; }중괄호는 일이 서브 쉘에서 실행되어서는 안된다는 것을 나타냅니다 ( ()대신 괄호를 사용 하는 방식 일 것입니다). 경고 : 마지막 세미콜론을 놓치지 마십시오 . 그렇지 않으면 bash가장 추악하고 가장 의미없는 오류 메시지가 출력 될 수 있습니다 .
syntaxerror

5
따옴표를 제거하지 않으면 우분투에서는 작동하지 않습니다. 그냥해야합니다 그래서[[ 12345 =~ ^[0-9]+$ ]] && echo OKKK || echo NOOO
토레

4
당신은 일해야합니다 보다 구체적인 당신이 무슨 뜻인지에 대해 "번호" . 정수? 고정 소수점 숫자? 과학적 ( "e") 표기법? 필요한 범위 (예 : 64 비트 부호없는 값)가 있거나 쓸 수있는 숫자를 허용합니까?
Toby Speight

답변:


803

한 가지 방법은 다음과 같이 정규식을 사용하는 것입니다.

re='^[0-9]+$'
if ! [[ $yournumber =~ $re ]] ; then
   echo "error: Not a number" >&2; exit 1
fi

값이 반드시 정수가 아닌 경우 정규식을 적절히 수정하십시오. 예를 들어 :

^[0-9]+([.][0-9]+)?$

... 또는 부호가있는 숫자를 처리하려면 :

^[+-]?[0-9]+([.][0-9]+)?$

7
이 방법에서는 +1이지만 10 진수를주의하여 "1.0"또는 "1,0"인쇄에서 "error : Not a number"로 표시합니다.
sourcerebels 2009

15
''exec> & 2; 에코 ...``어리석은. 그냥 ''echo ...> & 2 ''
lhunath

5
@Ben 당신은 정말로 둘 이상의 빼기 기호를 처리하고 싶습니까? 여러 반전을 올바르게 처리하기 위해 실제로 작업을 수행하지 않는 한 ^-?오히려 만들 ^-*것입니다.
Charles Duffy

4
@SandraSchlichting 모든 향후 출력을 stderr로 보냅니다. 여기서는 에코가 하나 뿐인 지점을 지적하지는 않지만 오류 메시지가 여러 줄에 걸쳐있는 경우에는 습관을들이는 습관입니다.
Charles Duffy

29
왜 정규 표현식을 변수에 저장 해야하는지 잘 모르겠지만 호환성을 위해 필요하지 않다고 생각합니다. 표현식을 직접 적용 할 수 있습니다 [[ $yournumber =~ ^[0-9]+$ ]]..
konsolebox

283

bashisms없이 (System V sh에서도 작동)

case $string in
    ''|*[!0-9]*) echo bad ;;
    *) echo good ;;
esac

이것은 빈 문자열과 숫자가 아닌 문자열을 거부하고 다른 모든 것을 허용합니다.

음수 또는 부동 소수점 숫자는 추가 작업이 필요합니다. 아이디어는 첫 번째 "나쁜"패턴에서 -/ 를 제외 .하고 부적절한 사용 ( ?*-*/ *.*.*)을 포함하는 "나쁜"패턴을 더 추가하는 것입니다 ( / )


20
+1-원래 Bourne 쉘로 돌아가는 관용적이고 휴대 가능한 방식이며, 글로브 스타일 와일드 카드를 기본적으로 지원합니다. 다른 프로그래밍 언어에서 오는 경우, 섬뜩한 보이지만, 훨씬 더 우아 다양한 인용 문제와 끝없는 뒤로 / 옆으로 호환성 문제의 취성에 대처보다는이다if test ...
tripleee

6
${string#-}음수를 허용 하기 위해 첫 번째 줄을 (고대 Bourne 쉘에서는 작동하지 않지만 POSIX 쉘에서는 작동합니다)로 변경할 수 있습니다 .
Gilles 'SO- 악마 그만'

4
또한 이것은 플로트까지 쉽게 확장 할 수 있습니다 '.' | *.*.*. 허용되지 않는 패턴을 추가하고 허용 된 문자에 점을 추가 하기 만하면 됩니다. 마찬가지로, 선택적인 부호를 허용 할 수 있지만, case ${string#[-+]}단순히 부호를 무시하는 것이 좋습니다.
tripleee

부호있는 정수 처리를 위해이를 참조하십시오 stackoverflow.com/a/18620446/2013911
니클라스 피터

2
@Dor case 명령은 어쨌든 해당 단어에서 단어 분할 및 경로 이름 생성을 수행하지 않으므로 따옴표는 필요하지 않습니다. (그러나 패턴 일치 문자가 문자인지 특수인지 여부를 판별하기 때문에 패턴의 경우 인용
부호가 필요할 수

193

정규식없이 Bourne과 같은 기본 쉘에서 다음 솔루션을 사용할 수도 있습니다. 기본적으로 숫자가 아닌 숫자를 사용하는 숫자 값 평가 작업은 오류를 발생시키고 셸에서 암시 적으로 false로 간주됩니다.

"$var" -eq "$var"

에서와 같이 :

#!/bin/bash

var=a

if [ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null; then
  echo number
else
  echo not a number
fi

당신은 또한 $를 테스트 할 수 있습니까? 보다 명백한 오퍼레이션의 리턴 코드 :

[ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null
if [ $? -ne 0 ]; then
   echo $var is not number
fi

표준 오류의 리디렉션은 숫자가없는 경우 bash가 출력하는 "정수 식 예상"메시지를 숨기는 것입니다.

주의 사항 (아래 의견 감사) :

  • 소수점이있는 숫자는 유효한 "숫자"로 식별 되지 않습니다.
  • [[ ]]대신에 사용 [ ]하면 항상true
  • 비 Bash 쉘은 대부분이 표현식을 다음과 같이 평가합니다. true
  • Bash의 동작은 문서화되어 있지 않으므로 경고없이 변경 될 수 있습니다.
  • 숫자에 공백이 포함 된 경우 (예 : "1 a") 다음과 같이 오류가 발생합니다. bash: [[: 1 a: syntax error in expression (error token is "a")
  • 값이 var-name과 같은 경우 (예 : i = "i") 다음과 같은 오류가 발생합니다. bash: [[: i: expression recursion level exceeded (error token is "i")

8
결과는 무엇이든 Bash에서 숫자 로 사용할 수 있기 때문에 여전히 이것을 권장합니다 (그러나 빈 문자열을 허용하도록 인용 된 변수 포함) .
l0b0

21
단일 브래킷을 사용하도록주의하십시오. [[ a -eq a ]]true로 평가됨 (두 인수 모두 0으로 변환 됨)
Tgr

3
아주 좋아요! 이것은 정수가 아닌 숫자에 대해서만 작동합니다. 정수 여야하는 단일 인수를 확인해야하므로 다음과 같이 작동했습니다.if ! [ $# -eq 1 -o "$1" -eq "$1" ] 2>/dev/null; then
haridsv

6
[내장이 인수를 산술로 평가하는 중요하지 않은 쉘 수 때문에이 방법에 대해 강력히 권고 합니다. 이것은 ksh93과 mksh 모두에 해당됩니다. 또한,이 두 가지 모두 배열을 지원하므로 코드 삽입이 용이합니다. 대신 패턴 일치를 사용하십시오.
ormaaj

3
@AlbertoZaccagni, 현재 bash 릴리스에서 이러한 값은 숫자 컨텍스트 규칙으로 만 해석되고 해석 [[ ]]되지는 않습니다 [ ]. 즉,이 동작은 testbash 자체 문서에 대한 POSIX 표준에 의해 지정되지 않습니다. bash의 이후 버전은 문서화 된 동작 약속을 위반하지 않고 ksh와 일치하도록 동작을 수정할 수 있으므로 현재 동작 지속에 의존한다고 안전하지는 않습니다.
Charles Duffy

43

이것은 숫자가 음이 아닌 정수이고 쉘과 독립적이며 (bashisms 없음) 쉘 내장만을 사용하는지 테스트합니다.

부정확합니다.

이 첫 번째 대답 (아래)은 변수에서 첫 번째가 아닌 한 문자가있는 정수를 허용합니다.

[ -z "${num##[0-9]*}" ] && echo "is a number" || echo "is not a number";

맞습니다 .

질 (Jilles)그의 답변 에서 언급하고 제안한 것처럼 , 이것은 쉘 패턴을 사용하여 올바른 방법입니다.

[ ! -z "${num##*[!0-9]*}" ] && echo "is a number" || echo "is not a number";

5
이것은 제대로 작동하지 않으며 숫자로 시작하는 문자열을 허용합니다. $ {VAR ## WORD} 및 이와 유사한 단어는 정규식이 아닌 쉘 패턴입니다.
jilles

2
그 표현을 영어로 번역 해 주시겠습니까? 나는 그것을 정말로 사용하고 싶지만, bash 맨 페이지를 읽은 후에도 그것을 믿을만큼 충분히 이해하지 못한다.
CivFan

2
*[!0-9]*숫자가 아닌 문자가 1 개 이상인 모든 문자열과 일치하는 패턴입니다. ${num##*[!0-9]*}변수의 내용을 가져 와서 num패턴과 일치하는 가장 긴 문자열을 제거 하는 "매개 변수 확장" 입니다. 매개 변수 확장 결과가 비어 있지 않은 경우 ( ! [ -z ${...} ]) 숫자가 아닌 문자를 포함하지 않으므로 숫자입니다.
mrucci

불행히도 이것은 유효한 숫자가 아니더라도 인수에 숫자가 있으면 실패합니다. 예를 들어 "exam1ple"또는 "a2b"입니다.
studgeek

둘 다 실패122s :-(
Hastur

40

아무도 bash의 확장 패턴 일치를 제안하지 않았습니다 .

[[ $1 == ?(-)+([0-9]) ]] && echo "$1 is an integer"

5
글렌, 나는 조건부 구성shopt -s extglob 에서 읽을 수 있기 때문에 게시물에서 제거 합니다 (여기서 내가 가장 좋아하는 대답 중 하나입니다) . 다음 과 같이 읽을 수 있습니다. 연산자를 사용할 연산자 오른쪽의 문자열은 패턴으로 간주되고 일치합니다 규칙에 따라하게 설명 패턴 매칭 은 if로, 쉘 옵션이 활성화되었다. 나는 당신이 상관하지 않기를 바랍니다! ==!=extglob
gniourf_gniourf

이러한 상황에서는 알 필요가 없습니다 shopt extglob... 알아 두는 것이 좋습니다!
gniourf_gniourf

간단한 정수에 적합합니다.

2
@Jdamian : 맞습니다. 이것은 Bash 4.1에 추가되었습니다 (2009 년 말에 출시되었습니다. Bash 3.2는 2006 년에 릴리스되었습니다. 이제는 과거에 갇힌 사람들에게는 유감스럽게도 골동품 소프트웨어입니다). 또한, 2.02 버전 (1998 년에 출시)에서 소개 된 익스트라 브는 <2.02 버전에서는 작동하지 않습니다… 이제 여러분의 의견은 이전 버전에 대한 경고로 작용할 것입니다.
gniourf_gniourf

1
내부 변수 [[...]]는 단어 분할 또는 glob 확장의 대상이 아닙니다.
glenn jackman

26

쉘에서 숫자 형식을 직접 구문 분석하는 솔루션에 놀랐습니다. 쉘은 파일과 프로세스를 제어하기위한 DSL 인 이것에 적합하지 않습니다. 예를 들어 다음과 같이 충분한 수의 파서가 있습니다.

isdecimal() {
  # filter octal/hex/ord()
  num=$(printf '%s' "$1" | sed "s/^0*\([1-9]\)/\1/; s/'/^/")

  test "$num" && printf '%f' "$num" >/dev/null 2>&1
}

'% f'를 필요한 특정 형식으로 변경하십시오.


4
isnumber(){ printf '%f' "$1" &>/dev/null && echo "this is a number" || echo "not a number"; }
Gilles Quenot

4
@sputnick 버전은 원래 함수의 고유하고 유용한 반환 값 의미를 손상시킵니다. 대신, 함수를 그대로두고 사용하십시오 :isnumber 23 && echo "this is a number" || echo "not a number"
michael

4
이것도 가지고 있지 않아야 2>/dev/null하므로 isnumber "foo"stderr을 오염시키지 않습니까?
gioele

4
bash "파일 및 프로세스 제어를위한 DSL"과 같은 최신 쉘을 호출하는 것은 그보다 훨씬 더 많이 사용된다는 것을 무시하고 있습니다. 일부 배포판은 전체 패키지 관리자와 웹 인터페이스를 내장하고 있습니다. 변수를 설정하는 것조차 어렵 기 때문에 배치 파일은 설명에 적합합니다.
Camilo Martin

7
다른 언어에서 일부 관용구를 복사하여 영리하려고한다는 것은 재밌습니다. 불행히도 이것은 껍질에서 작동하지 않습니다. 쉘은 매우 특별하며 이에 대한 확실한 지식이 없으면 깨진 코드를 작성할 수 있습니다. 코드가 깨졌습니다 : isnumber "'a"true를 반환합니다. 이것은 POSIX 스펙에 문서화되어 있습니다 : 선행 문자가 작은 따옴표 또는 큰 따옴표 인 경우, 값은 작은 따옴표 또는 큰 따옴표 다음에 나오는 문자의 기본 코드 세트에서 숫자 값이어야합니다. .
gniourf_gniourf

16

나는 대답을보고 있었고 ... 아무도 플로트 번호에 대해 생각하지 않았다는 것을 깨달았습니다 (점 포함)!

grep을 사용하는 것도 좋습니다.
-E는 확장 된 expexp를
의미합니다. -q는 조용함을 의미합니다 (반향되지 않음)
.

명령 행에서 직접 테스트하려면 다음을 수행하십시오.

$ echo "32" | grep -E ^\-?[0-9]?\.?[0-9]+$  
# answer is: 32

$ echo "3a2" | grep -E ^\-?[0-9]?\.?[0-9]+$  
# answer is empty (false)

$ echo ".5" | grep -E ^\-?[0-9]?\.?[0-9]+$  
# answer .5

$ echo "3.2" | grep -E ^\-?[0-9]?\.?[0-9]+$  
# answer is 3.2

bash 스크립트에서 사용 :

check=`echo "$1" | grep -E ^\-?[0-9]*\.?[0-9]+$`

if [ "$check" != '' ]; then    
  # it IS numeric
  echo "Yeap!"
else
  # it is NOT numeric.
  echo "nooop"
fi

JUST 정수와 일치 시키려면 다음을 사용하십시오.

# change check line to:
check=`echo "$1" | grep -E ^\-?[0-9]+$`

triple_r과 tripleee의 awk를 사용하는 솔루션은 float와 함께 작동합니다.
Ken Jackson

이것과 아주 좋은 점에 감사드립니다! 문제는 실제로 그것이 정수가 아닌 숫자 인지 확인하는 방법 입니다.
Tanasis

Tanasis도 감사합니다! 항상 서로 도와 드리겠습니다.
Sergio Abreu

12

@mary까지 팔로우하십시오. 그러나 충분한 담당자가 없기 때문에 해당 게시물에 대한 의견으로 게시 할 수 없습니다. 어쨌든, 여기 내가 사용한 것이 있습니다 :

isnum() { awk -v a="$1" 'BEGIN {print (a == a + 0)}'; }

인수가 숫자이면 함수는 "1"을 리턴하고 그렇지 않으면 "0"을 리턴합니다. 이것은 부동 소수점뿐만 아니라 정수에서도 작동합니다. 사용법은 다음과 같습니다.

n=-2.05e+07
res=`isnum "$n"`
if [ "$res" == "1" ]; then
     echo "$n is a number"
else
     echo "$n is not a number"
fi

4
종료 코드를 설정하는 것보다 숫자를 인쇄하는 것이 유용하지 않습니다. 'BEGIN { exit(1-(a==a+0)) }'grok 수 약간 어렵지만 true 또는 단지와 같은 false를 반환하는 함수에서 사용할 수 있습니다 [, grep -q
tripleee

9
test -z "${i//[0-9]}" && echo digits || echo no no no

${i//[0-9]}값의 숫자를 $i빈 문자열로 바꿉니다 ( 참조) man -P 'less +/parameter\/' bash. -z결과 문자열의 길이가 0인지 확인합니다.

$i비어 있는 경우를 제외하려면 다음 구성 중 하나를 사용할 수 있습니다.

test -n "$i" && test -z "${i//[0-9]}" && echo digits || echo not a number
[[ -n "$i" && -z "${i//[0-9]}" ]] && echo digits || echo not a number

man -P 'less +/parameter\/' bash부품의 경우 특히 엄지 손가락 입니다. 매일 새로운 것을 배우십시오. :)
David

@sjas \-문제를 해결하기 위해 정규식으로 쉽게 추가 할 수 있습니다 . [0-9\-\.\+]실수와 부호있는 숫자를 설명하는 데 사용 합니다.
user2683246 2014 년

@ sjas ok, 내 잘못
user2683246

@sjasecho $i | python -c $'import sys\ntry:\n float(sys.stdin.read().rstrip())\nexcept:\n sys.exit(1)' && echo yes || echo no
2683246

9

내 문제의 경우, 사용자가 실수로 텍스트를 입력하지 않도록 간단하게 읽을 수 있도록 노력해야했습니다.

isNumber() {
    (( $1 )) 2>/dev/null
}

매뉴얼 페이지에 따르면 이것은 내가 원하는 것을 거의 수행합니다.

표현식 값이 0이 아닌 경우 리턴 상태는 0입니다.

"숫자 일 수있는"문자열에 대한 불쾌한 오류 메시지를 방지하기 위해 오류 출력을 무시합니다.

$ (( 2s ))
bash: ((: 2s: value too great for base (error token is "2s")

이것은 isInteger와 비슷합니다. 그러나 굉장한 감사합니다!
Naheel

8

오래된 질문이지만 방금 해결책을 찾고 싶었습니다. 이것은 이상한 쉘 트릭을 필요로하지 않거나 영원히 있지 않은 것에 의존합니다.

if [ -n "$(printf '%s\n' "$var" | sed 's/[0-9]//g')" ]; then
    echo 'is not numeric'
else
    echo 'is numeric'
fi

기본적으로 입력에서 모든 숫자를 제거하고 길이가 0이 아닌 문자열로 남겨두면 숫자가 아닙니다.


비어 있으면 실패합니다 var.
gniourf_gniourf

또는 후행 줄 바꿈 또는 이와 유사한 변수가있는 변수의 경우 $'0\n\n\n1\n\n\n2\n\n\n3\n'.
gniourf_gniourf

7

아직 주석을 달 수 없으므로 bash 패턴 일치를 사용하여 glenn jackman의 답변을 확장하는 내 답변을 추가하겠습니다.

내 원래 필요는 숫자를 식별하고 정수와 부동 소수점을 구별하는 것이 었습니다. 함수 정의는 다음과 같이 차감되었습니다.

function isInteger() {
    [[ ${1} == ?(-)+([0-9]) ]]
}

function isFloat() {
    [[ ${1} == ?(-)@(+([0-9]).*([0-9])|*([0-9]).+([0-9]))?(E?(-|+)+([0-9])) ]]
}

패턴 테스트가 의도 한대로 작동하는지 확인하기 위해 단위 테스트 (shUnit2 사용)를 사용했습니다.

oneTimeSetUp() {
    int_values="0 123 -0 -123"
    float_values="0.0 0. .0 -0.0 -0. -.0 \
        123.456 123. .456 -123.456 -123. -.456
        123.456E08 123.E08 .456E08 -123.456E08 -123.E08 -.456E08 \
        123.456E+08 123.E+08 .456E+08 -123.456E+08 -123.E+08 -.456E+08 \
        123.456E-08 123.E-08 .456E-08 -123.456E-08 -123.E-08 -.456E-08"
}

testIsIntegerIsFloat() {
    local value
    for value in ${int_values}
    do
        assertTrue "${value} should be tested as integer" "isInteger ${value}"
        assertFalse "${value} should not be tested as float" "isFloat ${value}"
    done

    for value in ${float_values}
    do
        assertTrue "${value} should be tested as float" "isFloat ${value}"
        assertFalse "${value} should not be tested as integer" "isInteger ${value}"
    done

}

참고 : isFloat 패턴은 소수점 ( @(.,)) 및 E 기호 ( @(Ee))에 대해 더 관대하도록 수정할 수 있습니다 . 내 단위 테스트는 정수 또는 실수이지만 유효하지 않은 입력은 아닌 값만 테스트합니다.


죄송합니다. 편집 기능이 어떻게 사용되는지 이해하지 못했습니다.
3ronco

6

나는 이것을 시도 할 것이다 :

printf "%g" "$var" &> /dev/null
if [[ $? == 0 ]] ; then
    echo "$var is a number."
else
    echo "$var is not a number."
fi

참고 : 이것은 nan과 inf를 숫자로 인식합니다.


2
pixelbeat의 답변을 복제하거나 주석으로 더 적합합니다 ( %f어쨌든 사용하는 것이 더 좋습니다)
michael

3
이전 상태 코드를 확인하는 대신 왜 if자체 코드에 넣지 않겠습니까? 그게 뭐죠 if?if printf "%g" "$var" &> /dev/null; then ...
Camilo Martin

3
여기에는 다른 경고가 있습니다. 빈 문자열과 같은 문자열의 유효성을 검사합니다 'a.
gniourf_gniourf

6

@charles Dufy와 다른 사람들이 이미 명확한 대답을했습니다. 순수한 bash 솔루션은 다음을 사용합니다.

string="-12,345"
if [[ "$string" =~ ^-?[0-9]+[.,]?[0-9]*$ ]]
then
    echo $string is a number
else
    echo $string is not a number
fi

실수의 경우 기수 앞에 숫자가 있어야하는 것은 아닙니다 .

부동 수와 과학적 표기법 (C / Fortran의 많은 프로그램 또는이 방법으로 부동 수출)을보다 철저하게 지원하기 위해이 라인에 유용한 추가 사항은 다음과 같습니다.

string="1.2345E-67"
if [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*[eE]?-?[0-9]+$ ]]
then
    echo $string is a number
else
    echo $string is not a number
fi

따라서 특정 유형을 찾고 있다면 숫자 유형을 구별하는 방법으로 이어집니다.

string="-12,345"
if [[ "$string" =~ ^-?[0-9]+$ ]]
then
    echo $string is an integer
elif [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*$ ]]
then
    echo $string is a float
elif [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*[eE]-?[0-9]+$ ]]
then
    echo $string is a scientific number
else
    echo $string is not a number
fi

참고 : 십진수 및 과학적 표기법에 대한 구문 요구 사항을 나열 할 수 있습니다. 하나는 쉼표를 기수로, "."로 허용하는 것입니다. 그런 다음 기수 지점이 하나만 있어야한다고 주장합니다. [Ee] 플로트에는 두 개의 +/- 기호가있을 수 있습니다. 나는 Aulu의 연구에서 몇 가지 규칙을 더 배우고 '' '-' '-E-1' '0-0'과 같은 잘못된 문자열에 대해 테스트했습니다. 다음은 내 정규식 / 하위 문자열 / 전문가 도구입니다.

parse_num() {
 local r=`expr "$1" : '.*\([.,]\)' 2>/dev/null | tr -d '\n'` 
 nat='^[+-]?[0-9]+[.,]?$' \
 dot="${1%[.,]*}${r}${1##*[.,]}" \
 float='^[\+\-]?([.,0-9]+[Ee]?[-+]?|)[0-9]+$'
 [[ "$1" == $dot ]] && [[ "$1" =~ $float ]] || [[ "$1" =~ $nat ]]
} # usage: parse_num -123.456

6
[[ $1 =~ ^-?[0-9]+$ ]] && echo "number"

-음수를 포함하는 것을 잊지 마십시오 !


bash의 최소 버전은 무엇입니까? 방금 bash : 조건부 이진 연산자 예상 bash : 예기치 않은 토큰`= ~ '근처의 구문 오류
Paul Hargreaves

1
@PaulHargreaves =~는 적어도 bash 3.0까지 존재했습니다.
Gilles 'SO- 악마 그만해'

당신은 아마 당신의 첫 번째 피연산자의 문제, 예를 들어 너무 많은 따옴표 또는 이와 유사한했다 @PaulHargreaves
여호수아 클레이튼

@JoshuaClayton 솔라리스 7 박스에있는 매우 오래된 bash 이기 때문에 버전에 대해 물었습니다. 우리는 여전히 가지고 있으며 = ~를 지원하지 않습니다.
Paul Hargreaves

6

이는 grep문제의 변수가 확장 정규식과 일치하는지 확인하기 위해 사용하여 달성 할 수 있습니다 .

테스트 정수 1120:

yournumber=1120
if echo "$yournumber" | grep -qE '^[0-9]+$'; then
    echo "Valid number."
else
    echo "Error: not a number."
fi

산출: Valid number.

정수가 아닌 테스트 1120a:

yournumber=1120a
if echo "$yournumber" | grep -qE '^[0-9]+$'; then
    echo "Valid number."
else
    echo "Error: not a number."
fi

산출: Error: not a number.


설명

  • grep-E스위치는 우리가 확장 된 정규 표현식을 사용할 수 있습니다 '^[0-9]+$'. 이 정규 표현식은 변수 만한다는 뜻 []숫자가 포함 0-9으로부터 구를 통해 제로 ^받는 시작 $변수의 끝 이상이 있어야 +하나 개의 문자.
  • grep-q조용한 스위치는 무엇을 발견할지 여부를 모든 출력이 꺼집니다.
  • if의 종료 상태를 확인합니다 grep. 종료 상태 0는 성공을 의미하고 더 큰 것은 오류를 의미합니다. grep명령의 종료 상태가 0일치하는 항목을 찾은 경우와 1그렇지 않은 경우를;

그래서에, 모두 함께 퍼팅 if우리는 시험 echo변수 $yournumber|그에 파이프 grep에있는 -q자동 일치 스위치 -E확장 정규식 '^[0-9]+$'표현. 의 종료 상태가 grep될 것입니다 0경우 grep성공적으로 경기를 발견 1그것을하지 않았다합니다. 일치하면 우리는 echo "Valid number.". 일치하지 않으면 우리는 echo "Error: not a number.".


플로트 또는 복식

float 또는 double '^[0-9]+$''^[0-9]*\.?[0-9]+$'대해 정규식을에서 로 변경할 수 있습니다 .

플로트 테스트 1120.01:

yournumber=1120.01
if echo "$yournumber" | grep -qE '^[0-9]*\.?[0-9]+$'; then
    echo "Valid number."
else
    echo "Error: not a number."
fi

산출: Valid number.

플로트 테스트 11.20.01:

yournumber=11.20.01
if echo "$yournumber" | grep -qE '^[0-9]*\.?[0-9]+$'; then
    echo "Valid number."
else
    echo "Error: not a number."
fi

산출: Error: not a number.


부정적

음수를 허용하려면 정규식을에서 '^[0-9]+$'로 변경하십시오 '^\-?[0-9]+$'.

음수 부동 수 또는 배가 가능하게하려면 정규식을에서 '^[0-9]*\.?[0-9]+$'로 변경하십시오 '^\-?[0-9]*\.?[0-9]+$'.


맞습니다, @CharlesDuffy. 감사. 나는 대답을 정리했다.
조셉시

다시 당신은 @CharlesDuffy입니다. 결정된!
조셉시

1
LGTM; 편집 한 답변에 +1이 있습니다. 나는이 시점에서 다르게 할 줄 유일한 물건은 사용하지 않고 정확성 (F / E보다 의견의 문제입니다 [-]대신 \-하고 [.]대신 \.더 자세한 조금되지만 '당신의 문자열들이 경우 변경할 필요가 없습니다 의미 백 슬래시가 소비되는 컨텍스트에서 다시 사용됨).
Charles Duffy

4

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_04_03.html

bash의 문자 클래스를 사용할 수도 있습니다.

if [[ $VAR = *[[:digit:]]* ]]; then
 echo "$VAR is numeric"
else
 echo "$VAR is not numeric"
fi

숫자에는 공백, 소수점 및 부동 소수점에 대한 "e"또는 "E"가 포함됩니다.

그러나 C 스타일 16 진수 (예 : "0xffff"또는 "0XFFFF")를 지정하면 [[: digit :]]가 true를 반환합니다. 여기에 약간의 함정이 있습니다. bash를 사용하면 "0xAZ00"과 같은 작업을 수행하고 여전히 숫자로 계산할 수 있습니다 (16이 아닌 다른 기지에 대해 0x 표기법을 사용할 수있게 해주는 GCC 컴파일러의 이상한 기발한 말이 아닌가 ??? )

16 진수를 허용하지 않는 한 입력이 완전히 신뢰할 수없는 경우 숫자인지 테스트하기 전에 "0x"또는 "0X"를 테스트 할 수 있습니다. 그것은 다음에 의해 달성 될 것입니다 :

if [[ ${VARIABLE:1:2} = "0x" ]] || [[ ${VARIABLE:1:2} = "0X" ]]; then echo "$VAR is not numeric"; fi

17
[[ $VAR = *[[:digit:]]* ]]변수 에 정수 아닌 숫자 가 포함되어 있으면 true를 반환합니다 .
glenn jackman

[[ "z3*&" = *[[:digit:]]* ]] && echo "numeric"인쇄합니다 numeric. bash 버전에서 테스트되었습니다 3.2.25(1)-release.
Jdamian

1
@ultraswadable, 귀하의 솔루션은 다른 문자로 둘러싸인 하나 이상의 숫자를 포함하는 문자열을 감지합니다. 나는 공감했다.
Jdamian

그러므로 분명히 올바른 접근법은 이것을 [[ -n $VAR && $VAR != *[^[:digit:]]* ]]
뒤집는 것이며

@eschwartz, 솔루션이 음수로 작동하지 않음
Angel

4

가장 간단한 방법은 숫자가 아닌 문자가 포함되어 있는지 확인하는 것입니다. 모든 숫자 문자를 아무것도 바꾸지 않고 길이를 확인하십시오. 길이가 있으면 숫자가 아닙니다.

if [[ ! -n ${input//[0-9]/} ]]; then
    echo "Input Is A Number"
fi

2
음수를 처리하려면보다 복잡한 방법이 필요합니다.
Andy

... 또는 선택적인 양수 부호.
tripleee

@tripleee 당신이 그것을하는 방법을 알고 있다면 당신의 접근 방식을보고 싶습니다.
Andy

4

내가 최근 에 유닛 테스트를 한 karttu의 접근 방식 과 같이 이것을 조작해야했기 때문에 . 코드를 수정하고 다른 솔루션도 추가했으며 결과를 직접 확인하십시오.

#!/bin/bash

    # N={0,1,2,3,...} by syntaxerror
function isNaturalNumber()
{
 [[ ${1} =~ ^[0-9]+$ ]]
}
    # Z={...,-2,-1,0,1,2,...} by karttu
function isInteger() 
{
 [[ ${1} == ?(-)+([0-9]) ]]
}
    # Q={...,-½,-¼,0.0,¼,½,...} by karttu
function isFloat() 
{
 [[ ${1} == ?(-)@(+([0-9]).*([0-9])|*([0-9]).+([0-9]))?(E?(-|+)+([0-9])) ]]
}
    # R={...,-1,-½,-¼,0.E+n,¼,½,1,...}
function isNumber()
{
 isNaturalNumber $1 || isInteger $1 || isFloat $1
}

bools=("TRUE" "FALSE")
int_values="0 123 -0 -123"
float_values="0.0 0. .0 -0.0 -0. -.0 \
    123.456 123. .456 -123.456 -123. -.456 \
    123.456E08 123.E08 .456E08 -123.456E08 -123.E08 -.456E08 \
    123.456E+08 123.E+08 .456E+08 -123.456E+08 -123.E+08 -.456E+08 \
    123.456E-08 123.E-08 .456E-08 -123.456E-08 -123.E-08 -.456E-08"
false_values="blah meh mooh blah5 67mooh a123bc"

for value in ${int_values} ${float_values} ${false_values}
do
    printf "  %5s=%-30s" $(isNaturalNumber $value) ${bools[$?]} $(printf "isNaturalNumber(%s)" $value)
    printf "%5s=%-24s" $(isInteger $value) ${bools[$?]} $(printf "isInteger(%s)" $value)
    printf "%5s=%-24s" $(isFloat $value) ${bools[$?]} $(printf "isFloat(%s)" $value)
    printf "%5s=%-24s\n" $(isNumber $value) ${bools[$?]} $(printf "isNumber(%s)" $value)
done

따라서 isNumber () 는 대시, 쉼표 및 지수 표기법을 포함하므로 정수 및 부동 소수점에 대해서는 TRUE를 반환합니다. 반면에 isFloat () 는 정수 값에 대해 FALSE를 반환하고 isInteger () 는 부동에 대해 FALSE를 반환합니다. 편의를 위해 하나의 라이너로 :

isNaturalNumber() { [[ ${1} =~ ^[0-9]+$ ]]; }
isInteger() { [[ ${1} == ?(-)+([0-9]) ]]; }
isFloat() { [[ ${1} == ?(-)@(+([0-9]).*([0-9])|*([0-9]).+([0-9]))?(E?(-|+)+([0-9])) ]]; }
isNumber() { isNaturalNumber $1 || isInteger $1 || isFloat $1; }

개인적으로 function키워드가 유용하지 않으므로 키워드를 제거 합니다. 또한 반환 값의 유용성이 확실하지 않습니다. 달리 지정하지 않으면 함수는 마지막 명령의 종료 상태를 반환하므로 사용자는 return아무 것도 할 필요가 없습니다 .
Tom Fenech

참으로, returns는 혼란스럽고 읽기 어려워졌습니다. function키워드를 사용 하거나 사용 하지 않는 것은 개인 공간의 문제입니다. 적어도 공간을 절약하기 위해 하나의 라이너에서 키워드를 제거했습니다. 고마워.
3ronco

한 줄 버전에 대한 테스트 후에 세미콜론이 필요하다는 것을 잊지 마십시오.
Tom Fenech

2
isNumber는 숫자가있는 문자열에서 'true'를 반환합니다.
DrStrangepork

@DrStrangepork 사실, false_values ​​배열에 해당 경우가 없습니다. 나는 그것을 조사 할 것이다. 힌트 주셔서 감사합니다.
3ronco

4

expr을 사용 합니다. 숫자가 아닌 값에 0을 추가하려고하면 0이 아닌 값을 반환합니다.

if expr -- "$number" + 0 > /dev/null 2>&1
then
    echo "$number is a number"
else
    echo "$number isn't a number"
fi

정수가 아닌 사람이 필요하다면 bc 를 사용하는 것이 가능할 수도 있지만 bc, 똑같은 동작 이 없다고 생각 합니다. 숫자가 아닌 숫자에 0을 추가하면 0이되고 값 0도 반환합니다. 어쩌면 당신은 결합 할 수 있습니다bcexpr. bc에 0을 추가하는 데 사용 합니다 $number. 대답이 0인 경우 0이 아닌지 expr확인하십시오 $number.


1
이것은 오히려 나쁘다. 약간 더 나아지게하려면 다음을 사용해야합니다 expr -- "$number" + 0. 그러나 이것은 여전히 ​​그런 척 할 것입니다 0 isn't a number. 보낸 사람 man expr:Exit status is 0 if EXPRESSION is neither null nor 0, 1 if EXPRESSION is null or 0,
gniourf_gniourf

3

Alberto Zaccagni의 답변이 마음에 듭니다.

if [ "$var" -eq "$var" ] 2>/dev/null; then

중요한 전제 조건 :-생성 된 하위 셸 없음-호출 된 RE 파서 없음-대부분의 셸 응용 프로그램은 실수를 사용하지 않습니다

그러나 $var복잡한 경우 (예 : 연관 배열 액세스) 숫자가 음이 아닌 정수 (대부분의 사용 사례) 인 경우 더 효율적인가요?

if [ "$var" -ge 0 ] 2> /dev/null; then ..

2

형식 문자열 "% f"또는 "% i"를 제공하면 printf가 확인을 수행합니다. 수표를 재발 명하는 것보다 구문이 간단하고 짧으며 printf는 어디에나 있습니다. 내 의견으로는 괜찮은 선택입니다. 다음 아이디어를 사용하여 숫자를 확인하는 데 유용 할뿐만 아니라 다양한 것을 확인할 수 있습니다.

declare  -r CHECK_FLOAT="%f"  
declare  -r CHECK_INTEGER="%i"  

 ## <arg 1> Number - Number to check  
 ## <arg 2> String - Number type to check  
 ## <arg 3> String - Error message  
function check_number() { 
  local NUMBER="${1}" 
  local NUMBER_TYPE="${2}" 
  local ERROR_MESG="${3}"
  local -i PASS=1 
  local -i FAIL=0   
  case "${NUMBER_TYPE}" in 
    "${CHECK_FLOAT}") 
        if ((! $(printf "${CHECK_FLOAT}" "${NUMBER}" &>/dev/random;echo $?))); then 
           echo "${PASS}"
        else 
           echo "${ERROR_MESG}" 1>&2
           echo "${FAIL}"
        fi 
        ;;                 
    "${CHECK_INTEGER}") 
        if ((! $(printf "${CHECK_INTEGER}" "${NUMBER}" &>/dev/random;echo $?))); then 
           echo "${PASS}"
        else 
           echo "${ERROR_MESG}" 1>&2
           echo "${FAIL}"
        fi 
        ;;                 
                     *) 
        echo "Invalid number type format: ${NUMBER_TYPE} to check_number()." 1>&2
        echo "${FAIL}"
        ;;                 
   esac
} 

>$ var=45

>$ (($(check_number $var "${CHECK_INTEGER}" "Error: Found $var - An integer is required."))) && { echo "$var+5" | bc; }


2

정규식 vs 파라미터 확장

같이 찰스 더피의 응답 작업 만 사용 정규식 , 나는 이것이 느리다는 것을 알고, 나는 다른 방법을 보여주고 싶다.파라미터 확장 :

양의 정수에만 해당 :

is_num() { [ "$1" ] && [ -z "${1//[0-9]}" ] ;}

정수의 경우 :

is_num() { 
    local chk=${1#[+-]};
    [ "$chk" ] && [ -z "${chk//[0-9]}" ]
}

그런 다음 플로팅의 경우 :

is_num() { 
    local chk=${1#[+-]};
    chk=${chk/.}
    [ "$chk" ] && [ -z "${chk//[0-9]}" ]
}

초기 요청과 일치 시키려면 :

set -- "foo bar"
is_num "$1" && VAR=$1 || echo "need a number"
need a number

set -- "+3.141592"
is_num "$1" && VAR=$1 || echo "need a number"

echo $VAR
+3.141592

이제 약간의 비교 :

Charles Duffy의 답변을 기반으로 한 동일한 검사가 있습니다 .

cdIs_num() { 
    local re='^[+-]?[0-9]+([.][0-9]+)?$';
    [[ $1 =~ $re ]]
}

일부 테스트 :

if is_num foo;then echo It\'s a number ;else echo Not a number;fi
Not a number
if cdIs_num foo;then echo It\'s a number ;else echo Not a number;fi
Not a number
if is_num 25;then echo It\'s a number ;else echo Not a number;fi
It's a number
if cdIs_num 25;then echo It\'s a number ;else echo Not a number;fi
It's a number
if is_num 3+4;then echo It\'s a number ;else echo Not a number;fi
Not a number
if cdIs_num 3+4;then echo It\'s a number ;else echo Not a number;fi
Not a number
if is_num 3.1415;then echo It\'s a number ;else echo Not a number;fi
It's a number
if cdIs_num 3.1415;then echo It\'s a number ;else echo Not a number;fi
It's a number

그래, 괜찮아 이제이 모든 시간이 얼마나 걸릴까요 (내 라즈베리 파이에서) :

time for i in {1..1000};do is_num +3.14159265;done
real    0m2.476s
user    0m1.235s
sys     0m0.000s

그런 다음 정규 표현식을 사용하십시오.

time for i in {1..1000};do cdIs_num +3.14159265;done
real    0m4.363s
user    0m2.168s
sys     0m0.000s

내가 매개 변수 확장을 사용할 수있을 때 어쨌든, 내가 사용 정규식 안함 동의 ... RE의 남용은 bash는 스크립트 속도가 느린 것
F. 하우리

답변 편집 : 필요 없음 extglob(약간 더 빠름)!
F. Hauri

@CharlesDuffy, 내 라즈베리 파이에서 1000 회 반복하면 내 버전으로 2.5 초, 버전으로 4,4 초가 걸립니다!
F. Hauri

그것에 대해 논쟁 할 수 없습니다. 👍
Charles Duffy

1

음수를 잡으려면 :

if [[ $1 == ?(-)+([0-9.]) ]]
    then
    echo number
else
    echo not a number
fi

또한이를 위해서는 먼저 확장 글 로빙을 활성화해야합니다. 이것은 Bash 전용 기능이며 기본적으로 비활성화되어 있습니다.
tripleee

!는 @tripleee == 또는 = 사용할 경우 자동으로 활성화되는 확장 된 로빙 When the ‘==’ and ‘!=’ operators are used, the string to the right of the operator is considered a pattern and matched according to the rules described below in Pattern Matching, as if the extglob shell option were enabled. gnu.org/software/bash/manual/bashref.html#index-_005b_005b
바드르 Elmers

@BadrElmers 업데이트 해 주셔서 감사합니다. 이것은 내 Bash 3.2.57 (MacOS Mojave)에서 사실이 아닌 새로운 동작 인 것 같습니다. 4.4에서 설명한대로 작동한다는 것을 알았습니다.
tripleee

1

"let"을 다음과 같이 사용할 수도 있습니다.

[ ~]$ var=1
[ ~]$ let $var && echo "It's a number" || echo "It's not a number"
It\'s a number
[ ~]$ var=01
[ ~]$ let $var && echo "It's a number" || echo "It's not a number"
It\'s a number
[ ~]$ var=toto
[ ~]$ let $var && echo "It's a number" || echo "It's not a number"
It\'s not a number
[ ~]$ 

그러나이 스레드에서 일부 답변처럼 "= ~"Bash 3+ 연산자를 사용하는 것이 좋습니다.


5
이것은 매우 위험합니다. 쉘에서 검증되지 않은 산술을 평가하지 마십시오. 먼저 다른 방법으로 검증해야합니다.
ormaaj

1
printf '%b' "-123\nABC" | tr '[:space:]' '_' | grep -q '^-\?[[:digit:]]\+$' && echo "Integer." || echo "NOT integer."

-\?음의 정수를 허용하지 않으면 grep 일치 패턴을 제거하십시오 .


2
설명 부족으로 공감. 어떻게 작동합니까? 복잡하고 부서지기 쉽기 때문에 정확히 어떤 입력을 받아 들일지 확실하지 않습니다. (예를 들어, 공백을 제거해야합니까? 왜? 공백이 포함 된 숫자는 유효한 숫자이므로 바람직하지 않을 수 있습니다.)
tripleee

1

점으로 구분 된 전체 부분과 소수 부분을 테스트하는 정규 표현식으로 동일한 작업을 수행했습니다.

re="^[0-9]*[.]{0,1}[0-9]*$"

if [[ $1 =~ $re ]] 
then
   echo "is numeric"
else
  echo "Naahh, not numeric"
fi

귀하의 답변이 Charles Duffy의 답변과 같은 다른 기존 답변과 근본적으로 다른 이유를 설명해 주시겠습니까? 글쎄, 당신의 대답은 실제로 단일 기간을 유효하게하기 때문에 깨졌습니다..
gniourf_gniourf

여기에서 단일 기간을 이해하지 못하는 것은 ... 예상되는 1 또는 0 기간입니다 .... 근본적으로 다른 것은 없었습니다. 정규식을 읽기가 더 쉽다는 것을 알았습니다.
Jerome

또한 *를 사용하면 더 많은 실제 사례와 일치해야합니다.
Jerome

문제는 빈 문자열 a=''과 마침표 만 포함 된 문자열 과 일치 a='.'하므로 코드가 약간 손상되는 것입니다.
gniourf_gniourf

0

다음을 사용합니다 (정수).

## ##### constants
##
## __TRUE - true (0)
## __FALSE - false (1)
##
typeset -r __TRUE=0
typeset -r __FALSE=1

## --------------------------------------
## isNumber
## check if a value is an integer 
## usage: isNumber testValue 
## returns: ${__TRUE} - testValue is a number else not
##
function isNumber {
  typeset TESTVAR="$(echo "$1" | sed 's/[0-9]*//g' )"
  [ "${TESTVAR}"x = ""x ] && return ${__TRUE} || return ${__FALSE}
}

isNumber $1 
if [ $? -eq ${__TRUE} ] ; then
  print "is a number"
fi

거의 정확하지만 (빈 문자열을 받아들이고 있음) 난독 화 지점까지는 상당히 복잡합니다.
Gilles 'SO- 악마 그만'

2
잘못된 : 당신이 받아들이는 것 -n등 (때문에, echo), 당신은 (때문에 줄 바꿈을 후행 변수를 받아들이는 것 $(...)). print그건 그렇고, 유효한 쉘 명령이 아닙니다.
gniourf_gniourf

0

그것이 나에게 가장 실용적으로 보였기 때문에 ultrasawblade의 레시피를 시도했지만 그것을 작동시킬 수 없었습니다. 결국 나는 다른 방법으로 매개 변수 대체에 따라 다른 방법을 고안했다. 이번에는 정규식 대체로 :

[[ "${var//*([[:digit:]])}" ]]; && echo "$var is not numeric" || echo "$var is numeric"

$ var에서 모든 : digit : 클래스 문자를 제거하고 빈 문자열이 남아 있는지 확인합니다. 이는 원본이 숫자 일뿐임을 의미합니다.

이것에 대해 내가 좋아하는 것은 작은 설치 공간과 유연성입니다. 이 형식에서는 구분되지 않은 기본 10 정수에만 작동하지만 다른 요구에 맞게 패턴 일치를 사용할 수 있습니다.


mrucci의 솔루션을 읽으면 내 것과 거의 같지만 "sed style"대신 일반 문자열 대체를 사용합니다. 둘 다 패턴 일치에 동일한 규칙을 사용하며 AFAIK, 교체 가능한 솔루션입니다.
ata

sedPOSIX, 솔루션은 bash입니다. 둘 다 용도가 있습니다
v010dya

0

빠르다 & 더럽다 : 나는 그것이 가장 우아한 방법은 아니라는 것을 알고 있지만 보통 0을 추가하고 결과를 테스트합니다. 이렇게 :

function isInteger {
  [ $(($1+0)) != 0 ] && echo "$1 is a number" || echo "$1 is not a number"
 }

x=1;      isInteger $x
x="1";    isInteger $x
x="joe";  isInteger $x
x=0x16 ;  isInteger $x
x=-32674; isInteger $x   

$ 1이 정수가 아닌 경우 $ (($ 1 + 0))은 0을 반환하거나 폭탄을 반환합니다. 예를 들어 :

function zipIt  { # quick zip - unless the 1st parameter is a number
  ERROR="not a valid number. " 
  if [ $(($1+0)) != 0 ] ; then  # isInteger($1) 
      echo " backing up files changed in the last $1 days."
      OUT="zipIt-$1-day.tgz" 
      find . -mtime -$1 -type f -print0 | xargs -0 tar cvzf $OUT 
      return 1
  fi
    showError $ERROR
}

참고 : 전체 스크립트 폭탄을 만들 수있는 수레 또는 혼합 유형을 확인하지 않았다고 생각합니다 ... 제 경우에는 더 이상 가고 싶지 않습니다. 나는 mrucci의 솔루션과 Duffy의 정규식을 가지고 놀 것입니다-그것들은 bash 프레임 워크에서 가장 강력 해 보입니다 ...


4
이것은와 같은 산술 표현식을 허용 1+1하지만 선행 0s로 일부 양의 정수를 거부합니다 ( 08유효하지 않은 8 진 상수 이므로 ).
Gilles 'SO- 악마 그만'

2
이것은 다른 문제도 있습니다 : 0숫자가 아니며 임의 코드 삽입이 적용됩니다 isInteger 'a[$(ls)]'. 죄송합니다.
gniourf_gniourf

1
그리고 $((...))따옴표가 붙지 IFS=123않으면 숫자 가 변경됩니다.
Isaac
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.