대괄호는 조건부 테스트를 수행하기위한 약칭입니다. 대괄호 [
및 [[
는 믿거 나 말거나 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/[
builtins vs . 키워드
Bash man 페이지, man bash
를 살펴보면 2에 대한 다음 정의를 찾을 수 있습니다.
-
키워드 -예약어는 셸에 특별한 의미가있는 단어입니다. 다음 단어는 인용되지 않은 경우 예약 된 것으로 인식되고 간단한 명령의 첫 번째 단어 (아래 SHELL GRAMMAR 참조) 또는 대소 문자 또는 명령의 세 번째 단어 :
! case do done elif else esac fi for function if in select then until while { } time [[ ]]
-
builtins -명령 이름에 슬래시가 포함되어 있지 않으면 셸에서 찾기를 시도합니다. 그 이름으로 쉘 함수가 존재하는 경우 해당 함수는 F에서 위에서 설명한대로 호출됩니다. 기능. 이름이 함수와 일치하지 않으면 쉘은 쉘 내장 목록에서 해당 이름을 검색합니다. 일치하는 항목이 발견되면 해당 내장 기능이 호출됩니다.
이름이 쉘 함수도 내장 기능도 아니고 슬래시도 포함하지 않는 경우 bash는 다음과 같이 실행 파일이 포함 된 디렉토리를 PATH의 각 요소에서 검색합니다. 그 이름. Bash는 실행 파일의 전체 경로 이름을 기억하기 위해 해시 테이블을 사용합니다 (아래 SHELL BUILTIN COMMANDS 아래의 해시 참조). PATH의 디렉토리 전체 검색은 명령이 해시 테이블에없는 경우에만 수행됩니다. 검색에 실패하면 쉘은 command_not_found_handle이라는 정의 된 쉘 함수를 검색합니다. 해당 함수가 존재하면 원래 명령과 원래 명령의 인수를 인수로 사용하여 호출되고 함수의 종료 상태가 셸의 종료 상태가됩니다. 해당 함수가 정의되어 있지 않으면 쉘은 오류 메시지를 출력하고 종료 상태 127을 반환합니다.
맨 페이지
Bash man 페이지에서 자세한 내용을 찾을 수 있습니다.
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.
마지막 man 페이지에서 :
test and [ evaluate conditional expressions using a set of rules based on the number of arguments.
편집 # 1
OP의 후속 질문입니다.
좋습니다. 그렇다면 “if”가 필요합니까? 내 말은 “[“로 충분해도 “if”가 존재하는 이유입니다.
if
는 조건부의 일부입니다. test
명령 또는 [ ... ]
명령은 단순히 조건부를 평가하고 0 또는 a 1. 0 또는 1은 if 문에 의해 작동됩니다. 2는 사용할 때 함께 작동합니다.
예
if [ ... ]; then ... do this ... else ... do that ... fi
댓글
오우, 제가 좋아하는 주제 중 하나입니다 !!
대괄호는 “test”명령의 동의어입니다. 테스트 매뉴얼 페이지를 읽으면 “테스트 명령을
test -r /etc/profile.d/java.sh
또는
괄호와 내부 및 외부 항목 사이의 공백이 필요합니다.
이 경우”test “명령은 / etc / 파일이 있는지 확인합니다. profile.d / java.sh는 현재 사용자가 읽을 수 있습니다. 묵시적으로 존재 여부를 확인합니다. 🙂
&&
“왼쪽에있는 명령이 성공하면 오른쪽에있는 명령을 실행합니다. 따라서이 복합 명령은 다음과 같은 “if-then”의 축약 형입니다.
if test -r /etc/profile.d/java.sh then /etc/profile.d/java.sh fi
이제 이중 대괄호도 찾을 수 있습니다. bash man 페이지에 설명되어 있습니다. 이들은 확장 된 테스트 기능의 bash 내부 버전입니다. 그것들은 정확히 동일하지 않다는 점에 유의하십시오. “test”명령과 “test”명령으로 수행 할 수없는 작업으로 수행 할 수있는 작업이 있습니다. [ “동의어.
댓글