Bash는 다음 코드를 어떻게 평가합니까?

Bash는 다음 코드를 어떻게 평가합니까?

이 질문은 두 부분으로 구성됩니다.

(a) 잘라낸 코드가 무엇을 하는지 이해하기

(b) 차이점 이해종료 상태그리고반품 상태의 맥락에서 bash.

내가 이해하려고 하는 코드는 다음과 같습니다.

if var=-2 && (( var+=2 ))
then
    echo "True"
else
    echo "False"
fi

이것을 실행하면 False. 왜 이런 일이 일어나는지 이해할 수 없습니다.

내가 이것을 올바르게 이해한다면 다음과 같은 if상황이 발생할 수 있습니다.

(a) var=-2할당이 성공했기 때문에 종료 상태 0을 생성합니다.

(b) (( var+=2 ))값에 2를 더하고 var표현식은 0을 평가합니다. 따라서 이 용어의 종료 상태는 1입니다.

(c) 0 && 1은 0이라는 존재 상태를 생성한 다음 if구성 에 의해 사용됩니다.

구성은 if단순히 종료 상태를 확인하고 0일 때 다음을 수행합니다.그 다음에길. 위의 (c) 단계에서는 0이지만 스크립트는 여전히또 다른길. 이것을 이해하는 올바른 방법입니까?

그리고 계속해서 다양한 bash텍스트가 사용되는 것을 볼 수 있어요종료 상태그리고반품 상태교대로.

var=-2할당은 프로그램이 아니기 때문에 어떤 종류의 종료 상태도 가질 수 없을 것 같습니다 . 그러나 둘 사이의 차이점에 대한 설명은 훌륭할 것입니다.

답변1

그것은:

if
  first list of commands
then
  second list of commands
else
  third list of commands
fi

이는 첫 번째 명령 목록이 다음과 함께 반환되는 경우 두 번째 명령 목록을 실행하는 것입니다.진실/성공(제로) 종료 상태, 즉 마지막 실행 명령이 종료 상태 0으로 반환되는 경우입니다.

안에:

var=-2 && ((var += 2))

성공한 경우에만 실행되는 cmd1 && cmd2곳 입니다 .cmd2cmd1

var=-2

$var읽기 전용으로 설정되지 않은 한 일반적으로 성공하므로 ((var += 2))명령이 실행됩니다.

((arithmetic expression))

보고성공/진실표현식이 올바르게 평가되고(구문 오류 없음) 표현식 결과가 0이 아닌 경우에 한합니다.

  • ((123)), ((1 + 1)), ((1 == 1))참을 반환
  • ((0)), ((-2 + 2)), ((2 == -2))false를 반환합니다.
  • ((4294967296 * 4294967296))64비트 정수 래핑으로 인해 대부분의 쉘에서 false를 반환합니다.

var += 2산술 표현식으로 할당을 수행하고 할당되는 값(여기서는 0)으로 해석됩니다.거짓종료 상태.

$((...))산술 확장 구문을 사용하여 종료 상태의 기반이 되는 값을 확인할 수 있습니다 .

$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0

또는 변수에 할당합니다.

$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0

$?이전 명령의 종료 상태를 포함합니다. if// then/ 에 관한 한 0 elsefitrue를 의미하고, 그 외의 것은 false를 의미합니다.

여기서 혼란은 산술 표현식의 경우 그 반대라는 사실에서 비롯됩니다. 즉, 0거짓을 의미하고 다른 것은 모두 참을 의미합니다(예를 들어 2 == 2is 1while 2 < 1is 0).

차이점에 대해 걱정하지 않으려면 $?및 가능한 값을 잊어버리세요. 부울 관점에서 생각해보세요.진실/거짓,성공/실패.

 grep -q foo file

foo에서 가 발견 되면 true를 반환합니다 file.

 [ "$a" = "$b" ]

$a와 동일한 내용이 포함되어 있으면 true를 반환합니다 $b.

 ((6 * 3 - 12))
 ((4 == 1))

산술 표현식의 결과가 0이 아닌 숫자이면 true를 반환합니다.

그런 것들은 상관없어진실/거짓grep해당 / [명령 또는 ((...))구성 의 종료 상태를 0 또는 1로 표현합니다 .

답변2

(c) 0 && 1은 0이라는 존재 상태를 생성한 다음 if구성 에 의해 사용됩니다.

거기에 실수가 있습니다. 0 && 1 결과는 입니다 1. 이것은 C나 Java가 아닙니다. 기억하세요. 쉘에서 0 && 1 은 에서 얻을 수 있는 것입니다 true && false.

$ true; echo $?
0
$ false; echo $?
1
$ true && false; echo $?
1

또한 다양한 bash 텍스트가 종료 상태와 반환 상태를 같은 의미로 사용하는 것을 계속 봅니다.

그것들은 상호 교환 가능합니다. 명심해야 할 것은 0성공을 나타내고 0실패를 나타내지 않는다는 것입니다. 이는 0거짓이고 1참인 대부분의 프로그래밍 언어와 반대입니다 .

답변3

모든 것이 예상대로 작동합니다.

if var=-2 && (( var+=2 ))
then
    echo "True"
else
    echo "False"
fi

코드 설명 :-

if var=-2 && (( var+=2 ))

var=-2 => true 값이 0이 아니므로 true로 평가됩니다.

var+=2 => false 값이 0이므로 false로 평가됩니다.

이건 마치

if true && false

논리 계산대로참 && 거짓 => 거짓

이 경우 최종 코드는 다음과 같습니다.

if (false)
then
    echo "True"
else
    echo "False"
fi

관련 정보