
이 질문은 두 부분으로 구성됩니다.
(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
곳 입니다 .cmd2
cmd1
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 else
은 fi
true를 의미하고, 그 외의 것은 false를 의미합니다.
여기서 혼란은 산술 표현식의 경우 그 반대라는 사실에서 비롯됩니다. 즉, 0
거짓을 의미하고 다른 것은 모두 참을 의미합니다(예를 들어 2 == 2
is 1
while 2 < 1
is 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