대괄호 왼쪽에 "if"가 없다는 것은 무엇을 의미합니까? [복사]

대괄호 왼쪽에 "if"가 없다는 것은 무엇을 의미합니까? [복사]

내가 아는 한, 대괄호는 일반적으로 if else 문에서 표현식을 묶는 데 사용됩니다.

하지만 다음과 같이 대괄호를 사용할 때는 "if"가 사용되지 않는다는 것을 발견했습니다.

[ -r /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh

아래 스크립트에서.

#!/bin/bash### BEGIN INIT INFO  
# Provides:          jbossas7  
# Required-Start:    $local_fs $remote_fs $network $syslog  
# Required-Stop:     $local_fs $remote_fs $network $syslog  
# Default-Start:     2 3 4 5  
# Default-Stop:      0 1 6  
# Short-Description: Start/Stop JBoss AS 7  
### END INIT INFO  
# chkconfig: 35 92 1  

## Include some script files in order to set and export environmental variables  
## as well as add the appropriate executables to $PATH.  
[ -r /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh  
[ -r /etc/profile.d/jboss.sh ] && . /etc/profile.d/jboss.sh  

JBOSS_HOME=/sw/AS7  

AS7_OPTS="$AS7_OPTS -Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true"   ## See AS7-1625  
AS7_OPTS="$AS7_OPTS -Djboss.bind.address.management=0.0.0.0"  
AS7_OPTS="$AS7_OPTS -Djboss.bind.address=0.0.0.0"  

case "$1" in  
    start)  
        echo "Starting JBoss AS 7..."  
        #sudo -u jboss sh ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS           ##  If running as user "jboss"  
        #start-stop-daemon --start --quiet --background --chuid jboss --exec ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS   ## Ubuntu  
        ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS &  
    ;;  
    stop)  
        echo "Stopping JBoss AS 7..."  
        #sudo -u jboss sh ${JBOSS_HOME}/bin/jboss-admin.sh --connect command=:shutdown            ##  If running as user "jboss"  
        #start-stop-daemon --start --quiet --background --chuid jboss --exec ${JBOSS_HOME}/bin/jboss-admin.sh -- --connect command=:shutdown     ## Ubuntu  
        ${JBOSS_HOME}/bin/jboss-cli.sh --connect command=:shutdown  
    ;;  
    *)  
        echo "Usage: /etc/init.d/jbossas7 {start|stop}"; exit 1;  
    ;;  
esac  

exit 0  

"if" 없이 대괄호는 무엇을 합니까? 내 말은, 이 문맥에서 사용될 때 정확히 무엇을 의미합니까?

이것은 중복이 아닙니다저것OP가 "if"를 사용한 경우에는 문제가 없습니다. 이 질문에서는 괄호가 직관에 반하는 방식으로 사용됩니다. 이 질문과 이 질문은 동일한 답변을 가질 수 있지만 두 가지 다른 질문입니다.

답변1

대괄호는 조건부 테스트를 수행하기 위한 약식 표기법입니다. 믿거나 말거나 괄호 [는 Unix의 실제 명령입니다.[[

생각하다:

$ [ -f /etc/rc.local ] && echo "real file"
real file

-and-

$ test -f /etc/rc.local && echo "real file"
real file

Bash에서는 [내장 명령이자 실행 파일입니다. [[Bash의 키워드입니다.

다음을 사용하여 이를 확인할 수 있습니다 type.

$ type -a [
[ is a shell builtin
[ is /usr/bin/[

$ type -a [[
[[ is a shell keyword

여기에서 실제 실행 파일을 볼 수 있습니다.

$ ls -l /usr/bin/[
-rwxr-xr-x 1 root root 37000 Nov  3  2010 /usr/bin/[

내장 함수 및 키워드

Bash 매뉴얼 페이지를 보면 man bash2에 대한 다음 정의를 찾을 수 있습니다.

  • 핵심 단어- 예약어는 쉘에 특별한 의미를 갖는 단어입니다. 다음 단어는 따옴표가 없으면 예약어로 인식되며 간단한 명령(아래 SHELL GRAMMAR 참조)의 첫 번째 단어이거나 대소문자 또는 명령의 세 번째 단어입니다.

    ! case  do done elif else esac fi for function if in select then until while { } time [[ ]]
    
  • 내장 기능- 명령 이름에 슬래시가 포함되어 있지 않으면 쉘은 슬래시를 찾으려고 시도합니다. 동일한 이름의 쉘 함수가 존재하는 경우 위의 함수에 설명된 대로 호출됩니다. 이름이 함수와 일치하지 않으면 쉘은 쉘 내장 함수 목록에서 함수를 검색합니다. 일치하는 항목이 발견되면 내장 함수가 호출됩니다.

    이름이 쉘 함수도 내장 함수도 아니고 슬래시를 포함하지 않는 경우, bash는 PATH의 각 요소를 검색하여 해당 이름의 실행 파일이 포함된 디렉터리를 찾습니다. Bash는 실행 파일의 전체 경로 이름을 기억하기 위해 해시 테이블을 사용합니다(아래 SHELL BUILTIN COMMANDS 아래의 해시 참조). 해시 테이블에서 명령을 찾을 수 없는 경우에만 PATH의 디렉터리 전체 검색이 수행됩니다. 검색에 실패하면 쉘은 command_not_found_handle이라는 정의된 쉘 함수를 검색합니다. 함수가 존재하는 경우 함수는 원래 명령과 원래 명령의 인수를 인수로 사용하여 호출되며 함수의 종료 상태는 쉘의 종료 상태가 됩니다. 이 함수가 정의되지 않은 경우 쉘은 오류 메시지를 인쇄하고 종료 상태 127을 반환합니다.

매뉴얼 페이지

Bash 매뉴얼 페이지를 보면 이에 대한 자세한 정보를 찾을 수 있습니다.

test expr
[ expr ]
          Return a status of 0 or 1 depending on the evaluation of the 
          conditional expression expr.  Each operator and operand must be
          a separate argument.  Expressions are composed of the  primaries 
          described  above  under  CONDITIONAL EXPRESSIONS.   test does not 
          accept any options, nor does it accept and ignore an argument of 
          -- as signifying the end of options.

마지막으로 매뉴얼 페이지에서:

          test and [ evaluate conditional expressions using a set of rules
          based on the number of arguments.

편집 #1

OP에 대한 후속 질문입니다.

좋아요, 그렇다면 "if"가 왜 필요한가요? 내 말은, "["로 충분하다면 "if"가 왜 존재하는 걸까요?

if조건문의 일부입니다 . 명령 test또는 [ ... ]명령은 단순히 조건을 평가하고 0 또는 1을 반환합니다. 그러면 if 문은 0 또는 1에서 작동합니다. 두 가지를 함께 사용하면 함께 작동합니다.

if [ ... ]; then
   ... do this ...
else 
   ... do that ...
fi

답변2

아, 제가 가장 좋아하는 주제 중 하나예요! !

대괄호는 "test" 명령과 동의어입니다. 테스트 매뉴얼 페이지를 읽으면 다음을 사용하여 테스트 명령을 호출할 수 있음을 알 수 있습니다.

test -r /etc/profile.d/java.sh

또는

[ -r /etc/profile.d/java.sh ]

괄호 사이와 괄호 내부 및 외부의 모든 내용이 필요합니다.

이 예제의 "test" 명령은 현재 사용자가 /etc/profile.d/java.sh 파일을 읽을 수 있는지 여부를 확인합니다. 물론 Implicit는 존재 여부를 확인하는 것입니다. :-)

이는 &&"왼쪽 명령이 성공하면 오른쪽 명령을 실행한다"는 의미의 bash 구문 단축어입니다. 따라서 이 복합 명령은 "if-then"의 약어이며 다음과 같습니다.

if test -r /etc/profile.d/java.sh
then
  /etc/profile.d/java.sh
fi

이제 bash 매뉴얼 페이지에서 대괄호에 대한 설명도 찾을 수 있습니다. 이는 테스트 기능을 확장하는 bash 빌드입니다. 이는 정확히 동일하지 않습니다. "test" 명령과 "[" 동의어로 수행할 수 있는 작업이 있지만 수행할 수 없는 작업이 있습니다.

관련 정보