이것배쉬 FAQ설명하다
간단한 "숫자 문자열"의 유효성을 검사하려면 glob을 사용하여 이를 수행할 수 있습니다.
# Bash
if [[ $foo = *[!0-9]* ]]; then
echo "'$foo' has a non-digit somewhere in it"
else
echo "'$foo' is strictly numeric"
fi
저는 "아, 이거 멋지고 단순해 보이네"라고 생각했어요. 그런 다음 첫 번째 에코 이후에 "exit 1"을 추가하고 다음과 같이 변경한 것을 $foo
제외 하고는 스크립트에 정확하게 붙여넣었습니다.$1
if [[ $1 = *[!0-9]* ]]; then
echo "'$1' has a non-digit somewhere in it"
exit 1
else
echo "'$1' is strictly numeric"
fi
그런 다음 이것을 실행하고 얻으려고합니다.
$ sh foo.sh bar
bar
foo.sh: 6: [[: not found
'bar' is strictly numeric
나는 Bash 문맹이라고 말하기가 부끄럽기 때문에 여기서 무엇이 잘못되었는지 전혀 모릅니다. 지지받는 느낌을 받았어요온라인 배쉬 매뉴얼정규식과 일치하는 연산자는 이지만 =~
이를 변경해도 아무런 차이가 없습니다. 내가 알 수 있는 한, 여기서 문제의 연산자는 표준인 것으로 보입니다. 비록 와 사이의 차이점이 무엇인지는 모르겠지만 둘 다 테스트 [[
표현식 에 해당합니다 [[ ]]
. [ ]
저는 데비안 스퀴즈와 배쉬를 사용하고 있습니다.
$ bash --version
GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
데비안은 version 에 대해 이야기하고 있습니다 4.1-3
.
답변1
sh
그것이 bash 스크립트라면 왜 호출합니까? 분명히 시스템에서는 sh
bash가 아니라 Bourne/POSIX 계열의 다른 쉘입니다. 사실은 그렇지스프린트, 낮은 메모리 소비와 속도를 위해 설계된 작은 셸로, 거의 독점적으로 지원합니다.POSIX구성 및 내장 유틸리티.
[[ … ]]
Bash 및 zsh에서는 채택되었지만 POSIX에서는 채택되지 않은 Bourne 구문의 ksh 확장입니다. 휴대용 스크립트에서는 [ … ]
테스트에 필요합니다. 표준 구성은 패턴 일치를 지원하지 않습니다. 표준 관용구는 다음을 사용하는 것입니다.case
구조:
case $1 in # branch to the first pattern that $1 matches
*[!0-9]*) # pattern = anything containing a non-digit
echo not a number # do this if the first pattern triggered
;; # end of this case branch
*) # pattern = anything (else)
echo successor of $(($1-1)) # do this if the second pattern triggered
;; # end of this case branch
esac # end of the case construct
다음은 인수가 모두 숫자인지 테스트하는 함수입니다.
is_all_digits () {
case $1 in *[!0-9]*) false;; esac
}
여담:원래 위의 코드 조각에 오타가 있었습니다 $(($0-1))
. 이로 인해 이상하게 보이는 오류 메시지가 표시되었습니다.
$ ash foo.sh 42
foo.sh: 4: arithmetic expression: expecting EOF: "foo.sh-1"
$ ash ./foo.sh 42
./foo.sh: 4: arithmetic expression: expecting primary: "./foo.sh-1"
$ ksh ./foo.sh 42
./foo.sh: line 3: foo.sh: invalid variable name
$ pdksh ./foo.sh 42
./foo.sh[4]: ./foo.sh-1: unexpected `.'
$ bash foo.sh 42
foo.sh: line 3: foo.sh-1: syntax error: invalid arithmetic operator (error token is ".sh-1")
$ bash ./foo.sh 42
./foo.sh: line 3: ./foo.sh-1: syntax error: operand expected (error token is "./foo.sh-1")
$ zsh foo.sh 42
foo.sh:3: bad floating point constant
$0
은 스크립트의 이름이므로 평가할 산술 표현식은 foo.sh-1
또는 입니다 ./foo.sh-1
. 쉘 간의 다양한 오류 메시지를 관찰할 수 있습니다. 나는 Ash의 메시지와 bash의 메시지가 가장 명확하지 않다는 사실에 조금 놀랐습니다 ./
. 다른 쉘 중 어느 것도 문제가 산술 표현식에 있다는 것을 언급하지 않았습니다. Ash와 pdksh는 오류 줄을 보고하기 위해 중지됩니다.
답변2
를 사용하여 실행해 보세요 bash foo.sh bar
. bash 스크립트를 작성하려면 bash를 사용해야 합니다. 위에서 사용된 [[ 및 ]]는 Bourne 쉘의 파생물인 bash에서만 사용됩니다. sh는 Bourne SHell을 의미하며 bash와 다를 수 있습니다. 나는 데비안이 sh에 대시를 사용한다고 생각합니다. Bash 관련 기능이 필요하지 않은 이식 가능한 Bourne 쉘 스크립트를 작성하는 방법을 배우려면 grep을 사용하여 다음을 다시 작성할 수 있습니다.
if echo "$foo" | grep '^[0-9][0-9]*$' >/dev/null 2>&1; then
echo "'$1' has a non-digit somewhere in it"
exit 1
else
echo "'$1' is strictly numeric"
fi
답변3
나는 사용하는 것이 좋습니다expr
POSIX 표준을 준수하기 때문에:
if [ "$(expr "$1" : '^[0-9]\+$')" = "0" ]; then
echo "'$1' has a non-digit somewhere in it"
exit 1
else
echo "'$1' is strictly numeric"
fi