다음이 포함 된 bash 스크립트가 있습니다.
#!/bin/bash -e egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then echo "doesn"t exist" fi
이 스크립트는 -e없이 실행하십시오. 이 스크립트에서 -e
는 무엇을합니까? 또한 이러한 맥락에서 $?
는 무엇을합니까?
댓글
답변
귀하의 게시물에 실제로 2 개의 질문이 있습니다.
-
-e
플래그는 스크립트가 오류 발생시 종료하도록 지시합니다. 추가 플래그오류가 있으면 즉시 종료됩니다.
-
$?
는 마지막 명령의 종료 상태입니다. Linux에서0
의 종료 상태는 명령이 성공했음을 의미합니다. 다른 상태는 오류가 발생했음을 의미합니다.
이 답변을 스크립트에 적용하려면 :
egrep "^username" /etc/passwd >/dev/null
/etc/passwd
파일에서 username
를 찾습니다.
-
찾는 경우 그러면 종료 상태
$?
는0
와 같습니다. -
그렇지 않은 경우 “종료 상태가
0
가 아닙니다. 여기에서echo "doesn"t exist"
부분을 실행하고 싶을 것입니다. 코드.
안타깝게도 스크립트에 오류가 있습니다. 사용자가 존재하는 경우 코드를 실행합니다.-행을
논리를 올바르게 설정합니다.
그러나 사용자가 “없음, egrep
는 오류 c를 반환합니다. ode 및 -e
옵션으로 인해 셸이 해당 줄 바로 뒤에 종료되므로 코드의 해당 부분에 도달 할 수 없습니다.
댓글
- 또한 처음 두 줄을
if egrep "^username" /etc/passwd >/dev/null
로 바꾸면 -e없이 스크립트가 올바르게 작동하도록 할 수 있습니다. - 왜
set
가 필요하지 않습니까? :-/ - @pst :
-e
가 명령 줄 인수로 bash에 제공되기 때문입니다.set
아래에 나열된 모든 옵션은 명령 줄의 bash에서도 허용됩니다. 설명서의 옵션 섹션에있는 첫 번째 문장에 유의하세요. 페이지.
답변
모든 bash 명령 줄 스위치는 man bash
.
-e Exit immediately if a pipeline (which may consist of a single simple command), a subshell command enclosed in parentheses, or one of the commands executed as part of a command list enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command"s return value is being inverted with !. A trap on ERR, if set, is executed before the shell exits. This option applies to the shell environment and each subshell envi- ronment separately (see COMMAND EXECUTION ENVIRONMENT above), and may cause subshells to exit before executing all the commands in the subshell.
댓글
- Ahh. 나는 그 사람에게서 그것을 찾았지만, 파일 테스트에서 -e를 찾은 후 내가 포기한 주요 인수 아래에서 -e를 찾지 못했습니다. 좋은 발췌. 왜
set
가 필요하지 않습니까? :-/
답변
스크립트가 올바르지 않습니다.
egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then #echo "doesn"t exist" # WRONG echo "the USER EXISTS" fi
종료 상태 0-의미-모든 것이 정상입니다. grep의 경우”OK, 문자열을 찾았습니다 “를 의미합니다. 종료 상태! = 0은 무언가 잘못되었음을 의미합니다. grep 1의 경우 “찾을 수 없음”, 2는 “입력을 열 수 없음”을 의미합니다 …
-e
가 없습니다 (정답 주소를보고 싶습니다).$?
에는 마지막 종료 코드 (위에서 생성 된egrep
프로세스의 코드)가 포함됩니다.-e
는set
에 문서화되어 있습니다.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
와[
. 이 스크립트는 '-e
에서 작동하지 않습니다.grep
'-e
에서 아무것도 찾지 못하면 스크립트가 바로 종료됩니다.-e
가 없으면 ' 메시지가 거꾸로 표시됩니다. 상태 ($?
) 0은 grep이 사용자를 찾았 음을 의미합니다. 참고로 이것은`grep ' ^ username : '이어야합니다 (만약 ' 이름이 더 긴 다른 사용자입니까?).#/bin/bash -e
는#/bin/bash
1 행 및set -e
2 행?