$# 및 $를 구문적으로 정확하고/좋은 습관으로 사용하고 있습니까? 산술 테스트 조건에서?

$# 및 $를 구문적으로 정확하고/좋은 습관으로 사용하고 있습니까? 산술 테스트 조건에서?

나는 많은 게시물을 사용하여 보았다

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-neman bash

관련 정보