function foo {
(cd $FOOBAR;
<some command>
if [$? -ne 0]
then
echo "Nope!"
else
echo "OK!"
fi
)
}
위와 같은 함수를 작성하여 내 .bashrc 파일에 넣으려고합니다. 파일을 소스로 실행 한 후 다음을 얻습니다.
총 시간 : 51 초
-bash : [1 : 명령을 찾을 수 없습니다
!
누군가 내가 잘못한 것을 이해하도록 도울 수 있습니까?
답변
상기 후 공간을 추가 [
하고, 다른를하기 전에 ]
:
function foo {
(cd $FOOBAR;
<some command>
if [ $? -ne 0 ]
then
echo "Nope!"
else
echo "OK!"
fi
)
}
[
쉘 내장이며,이 명령은 같다 echo
, read
, expr
… 그것은 뒤에 공백을 필요로하고 일치가 필요합니다 ]
.
쓰기가 [ $? -ne 0 ]
실제로 호출하는 [
과 4 개 매개 변수를 제공합니다 : $?
, -ne
, 0
,와 ]
.
참고 : 오류가 발생했다는 [1: command not found
사실 $?
은의 값을 의미합니다 1
.
답변
아니면 $?
완전히 건너 뛸 수 있습니다. 명령이 cmd
인 경우 다음이 작동합니다.
function foo {
(cd $FOOBAR;
if cmd
then
echo "OK!"
else
echo "Nope!"
fi
)
}
답변
변수를 사용하기 전에 반환 값을 변수에 할당하는 것이 좋습니다
retval="$?"
if [ $retval -ne 0 ]
반환 값을 재사용 할 수 있습니다. 예를 들어 if … elif … else … 문에서.
답변
명령 $?
에 대한 인수로 [
명령 을 사용하려는 유일한 이유 는 ( 명령 [
의 조건 부분에서 명령이 실행 되는지 여부에 관계없이 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>
실패).
답변
아래 명령이 한 줄로 원하는 모든 것을 할 것이라고 믿습니다.
(( verify = $?!=0?'Nope!':'OK!' ))