나는 많은 게시물을 사용하여 보았다
if [ $? -ne 0 ]; then
return
fi
if [ $? -eq 0 ]; then
eval "set -- ${opts}"
while [ $# -gt 0 ]; do
case $1 in
"Last Exit Status"와 "Number of Positional Arguments"의 값을 확인하는데 사용됩니다.
그러나 나는 명백한 문제없이 다음과 같이 사용하고 $#
있습니다 $?
.
if (( $? != 0 )); then
...
또는
if (( $? == 0 )); then
...
그렇다면 이러한 방법 중 하나는 나쁜 습관입니까, 아니면 구문 규칙을 "확장"하는 반면, 다른 하나는 이러한 변수를 사용하는 "올바른" 방법입니까? 아니면 두 스타일을 모두 사용해도 안전합니까?
답변1
예, $?
(및 $#
)은 숫자 값이며 산술 비교 구조를 사용할 수 있습니다. 그러나 (( ... ))
as 테스트 구성을 사용하는 것은 Bash에만 해당되며 이런 방식으로 작성된 스크립트는 이식 가능하지 않을 수 있습니다. 이는 산술과 $(( ... ))
동일하지 않습니다.확장이것은POSIX 표준 기능.
[ $? -eq ... ]
확인을 위해 (또는 Bash 특정 [[ ... ]]
) 테스트 구조를 사용하는 이유 $?
는 산술적 맥락에서는 필요하지 않기 때문에 일반적으로 변수 참조에서 생략되지만 $
( 및 )의 경우에는 불가능합니다.$?
$#
의 수치 범위는 $?
0 ~ 255 (1)(2) 입니다 . 원칙적으로 를 반환하는 쉘 스크립트를 작성할 수 있지만 exit -2
실행 $?
후 호출은 일반적으로 254를 표시합니다(그러나 모든 쉘이 이를 허용하는 것은 아닙니다. 일부는 sh: 1: exit: Illegal number: -2
그 반대라고 말합니다).
(1) @glenn jackman이 주석에서 설명했듯이 종료 상태는 unsigned char
변수로 구현되므로 0에서 255 사이의 정수만 유지하도록 보장됩니다.
(2) 또한 @Paul_Pedant가 주석에서 지적했듯이 실행 파일의 프로그래머는 종료 코드로 0-255 범위의 값을 선택할 수 있지만 0은 일반적으로 성공적인 완료를 나타내는 데 사용되며 쉘은 125보다 높은 값을 사용할 수 있습니다. 위에서 설명한 특별한 방법여기예를 들어, 이 경우 정확한 값은 신뢰할 수 없거나 적어도 정확하게 해석하기 어려울 수 있습니다.
답변2
예, $?
마지막 프로세스의 상태는 0에서 255 사이의 숫자 값입니다.
그러나 ==
문자열 비교 연산자와 숫자 값을 사용하는 것은 현명하지 않습니다. 대신 및 를 !=
사용하세요 . 읽다 .-eq
-ne
man bash