[unix] $? if 문에서

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 씨의 사건 bashyash(와 최신 버전의 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!' ))


답변