명령 $?에 대한 인수로 [명령 을 사용하려는 유일한 이유 는 ( 명령 [의 조건 부분에서 명령이 실행 되는지 여부에 관계없이 if) 다음과 같이 특정 리턴 상태를 구별하려고 할 때입니다.
until
cmd
[ "$?" -gt 1 ]
do
something
done
모든 사람들을위한 구문은 if, while, until... 문이다
if cmd-list1
then cmd-list2
else cmd-list3
fi
성공 cmd-list2여부 cmd-list1에 관계없이 실행 됩니다 cmd-list3.
[ "$?" -eq 0 ]명령은 어떤 조합입니다. 이 설정 $?경우 0으로 $?0이며, $?그 이외의 영점 인 경우 0이 아닌.
cmd실패 했을 때 무언가를 실행하려면 다음과 같습니다.
if ! cmd
then ...
fi
일반적으로 $?어떤 값이 true또는을 의미하는지 혼자 알지 않아도됩니다 false. 특정 값을 구별해야하거나 나중에 저장 해야하는 경우 (예 : 함수의 반환 값으로 반환) 유일한 경우는 위에서 말한 것입니다.
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
또한 따옴표없는 변수를 남겨 두는 것은 split + glob 연산자라는 것을 기억하십시오. 여기에서 해당 연산자를 호출하는 것은 의미가 없으므로 다음과 같아야합니다.
[ "$?" -ne 0 ]
아니 [ $? -ne 0 ], 홀로 [$? -ne 0 ](만 호출 할 것이다 [경우 명령 $IFS의 첫 번째 문자를 포함 할 일이 $?).
또한 함수를 정의하는 Bourne 방식 function-name()은 명령 앞에 붙는 것 입니다. 즉, 제외 쉘과 같은 모든 Bourne 씨의 사건 bash과 yash(와 최신 버전의 posh유일한 복합 명령 (화합물 명령 인 허용) {...}나 (...)또는 같은 것들 for...done, if...fi...
function foo { ... }은 IS ksh함수 정의 문법. 여기서 사용하고 싶은 이유는 없습니다.
코드를 이식 가능하게 (POSIX) 작성할 수 있습니다.
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
또한 cd없는 -P특수한 의미 ( ..다른 명령과 다르게 구성 요소 를 포함하는 경로를 처리 )가 있으므로 혼동을 피하기 위해 스크립트에 포함하는 것이 좋습니다.
(함수가 반환하는 false경우는 cd실패가 아닌 경우 <some command>실패).
$?IS가와 0이if문 무의미if명령을 예상하고 있는 경우 명령이 리턴 말했다0, 그것은 블록의 코드를 실행합니다. 그래서if true; then echo hello; fi명령이 에코합니다 안녕하세요 이후true반환0.