이 질문에는 두 부분이 있습니다.
(a) 잘린 코드가 수행하는 작업을 이해합니다.
(b) 둘 사이의 차이점을 이해하라종료 상태그리고반품 상태in... 배경화면 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입니다.
if
(c) 0 && 1은 0이라는 존재 상태를 생성한 다음 생성자에 의해 사용됩니다.
생성자 는 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) 종료 상태, 즉 마지막 명령 실행이 종료 상태 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
///즉, 0은 true를 나타내고 then
, 그 외의 값은 false를 나타냅니다 else
.fi
여기서 혼란은 산술 표현식의 경우 그 반대라는 사실에서 비롯됩니다. 즉, 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
if
(c) 0 && 1은 0이라는 존재 상태를 생성한 다음 생성자에 의해 사용됩니다.
거기에 오류가 있습니다. 0 && 1 결과는 입니다 1
. 이는 C나 Java가 아니라는 점을 기억하세요. 쉘에서 0 && 1은 에서 얻는 것입니다 true && false
.
$ true; echo $?
0
$ false; echo $?
1
$ true && false; echo $?
1
또한 종료 상태와 반환 상태를 서로 바꿔서 사용하는 다양한 bash 텍스트가 계속 표시됩니다.
그것들은 상호 교환 가능합니다. 기억해야 할 것은 0
성공이 실패를 의미하지 않는다는 것 입니다 0
. 이는 대부분의 프로그래밍 언어와 반대되는 것, 즉 0
false와 1
true입니다.
답변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