programing

Bash의 단일 대괄호와 이중 대괄호의 차이

muds 2023. 4. 11. 22:39
반응형

Bash의 단일 대괄호와 이중 대괄호의 차이

를 읽고 있습니다.if도 합니다.

if [ -f $param ]
then
  #...
fi

이중 대괄호가 있는 기타 항목:

if [[ $? -ne 0 ]]
then
    start looking for errors in yourlog
fi

뭐가 다른데?

★★[]포식스

★★[[]]입니다.[]bash 및 bash bash ( zsh 、 ksh ) 。포식스를 들면, '먹다'와 같이요.||-o와 합니다.=~차이에 대한 자세한 목록은 조건부 구조에 대한 bash 매뉴얼 섹션에서 확인할 수 있습니다.

[]스크립트를 쉘을 통해 이동할 수 있도록 하려면 언제든지 필요합니다.[[]]에서 []휴대할 필요가 없습니다.

동작의 차이

Bash 4.3.11에서 테스트 완료:

  • POSIX vs Bash 확장:

  • 일반 명령 vs 매직

    • [그냥 이상한 이름을 가진 일반 명령어일 뿐이에요

      ]에 불과합니다.[.

    16 Ubuntu 16.04에 ./usr/bin/[coreutils에 의해 제공되지만 bash 내장 버전이 우선됩니다.

    Bash가 명령어를 해석하는 방법은 변경되지 않습니다.

    히,는< 리다이렉트, 리다이렉트, 리다이렉트.&& ★★★★★★★★★★★★★★★★★」||명령어를 합니다.( )는, 에 의해서 되지 않는 한, 을 생성합니다.\이치노

    • [[ X ]] 、 「 「 」를 단일 입니다.X법에에걸걸걸<,&&,|| ★★★★★★★★★★★★★★★★★」()특별한 취급을 받으며 단어 분할 규칙이 다릅니다.

      다른 .= ★★★★★★★★★★★★★★★★★」=~.

    [명령어입니다.[[키워드 https://askubuntu.com/questions/445749/whats-the-difference-between-shell-builtin-and-shell-keyword 입니다.

  • <

    • [[ a < b ]] : 전전 : : 。
    • [ a \< b ] .: 와와같같같같다다 \츠키다그렇지 않으면 다른 명령어로 리다이렉트 할 수 없습니다.Bash ★★★★★★★★★★★▼
    • expr x"$x" \< x"$y" > /dev/null ★★★★★★★★★★★★★★★★★」[ "$(expr x"$x" \< x"$y")" = 1 ]: POSIX 등가, 를 참조해 주세요.Bash 이하의 사전 편찬 문자열을 테스트하는 방법
  • && ★★★★★★★★★★★★★★★★★」||

    • [[ a = a && b = b ]]: 참, 논리
    • [ a = a && b = b ] 오류, : "구문 오류",&&되어 AND 명령어세퍼레이터로 해석됩니다.cmd1 && cmd2
    • [ a = a ] && [ b = b ] 동등품: POSIX 뢰 : : : : : 。
    • [ a = a -a b = b ]하지만, 되지 않습니다.이것은 이며, 일부 입니다.POSIX pos 、 POSIX 、 POSIX の 。그 이유는, 일부의 값에서는 실패하기 때문입니다.a ★★★★★★★★★★★★★★★★★」b! ★★★★★★★★★★★★★★★★★」(은 논리 이다.
  • (

    • [[ (a = a || a = b) && a = b ]]: false.( ) 말은 하다, 하다, 하다, 하다.[[ && ]][[ || ]]
    • [ ( a = a ) ] 오류, : "구문 오류",()됩니다.
    • [ \( a = a -o a = b \) -a a = b ]단 : ""(),-a , , , , 입니다.-o되지 않습니다.\( \)-a-o
    • { [ a = a ] || [ a = b ]; } && [ a = b ]에는 그냥 '있다', '어느 정도', '어느 정도', '어느 정도' 이렇게 쓸 수도 있어요.[ a = a ] || [ a = b ] && [ a = b ] 이유는|| ★★★★★★★★★★★★★★★★★」&&는 셸음음음 음음음음음음음음음음음과 달리 동등한 .[[ || ]] ★★★★★★★★★★★★★★★★★」[[ && ]] ★★★★★★★★★★★★★★★★★」-o,-a ★★★★★★★★★★★★★★★★★」[
  • 단어 분할 및 확장 시 파일 이름 생성(filename+filename)

    • x='a b'; [[ $x = 'a b' ]] 없습니다: 따옴표는 필요 없습니다.따옴표는 필요 없습니다.
    • x='a b'; [ $x = 'a b' ] 오류,: "" " " " " " " " 로 확장됩니다.[ a b = 'a b' ]
    • x='*'; [ $x = 'a b' ] 오류가 발생합니다 현재 디렉토리에 여러 파일이 있는 경우 구문 오류가 발생합니다.
    • x='a b'; [ "$x" = 'a b' ]: POSIX 당당
  • =

    • [[ ab = a? ]]: true, 패턴 매칭이 이루어지기 때문입니다(* ? [ 현재 디렉토리의 .현재 디렉토리의 파일로 글로벌하게 확장되지 않습니다.
    • [ ab = a? ]a?지구본이 팽창하다.따라서 현재 디렉토리의 파일에 따라 true 또는 false일 수 있습니다.
    • [ ab = a\? ] expansion이 아닌 false: false, 벌,,, :벌,,, : 。
    • = ★★★★★★★★★★★★★★★★★」== 다 똑같다[ ★★★★★★★★★★★★★★★★★」[[==부끄부끄부끄부끄 부끄부끄부끄 부끄부끄부끄덕.
    • case ab in (a?) echo match; esac: POSIX 당당
    • [[ ab =~ 'ab?' ]]: false, 마법이 사라집니다.''3.2 및 3('Bash 3.1'과 ).BASH_COMPAT=3.1)
    • [[ ab? =~ 'ab?' ]]: »
  • =~

    • [[ ab =~ ab? ]]: true, POSIX 확장 정규 표현 일치,? glob expand (글로브 )
    • [ a =~ a ] 오류 구문 오류입니다.배시
    • printf 'ab\n' | grep -Eq 'ab?' POSIX ( 행 : )
    • awk 'BEGIN{exit !(ARGV[1] ~ ARGV[2])}' ab 'ab?': POSIX 등 pos 。

" 사용": " " "[]

POSIX에는 POSIX에 이 있습니다.[[ ]]내가 본 건축물이요.

「 」를 사용하고 [[ ]] 사용자:

  • 휴대성을 잃다
  • 독자에게 다른 bash 확장의 복잡성을 배우도록 강요한다. [는 이름이 이상한 일반 명령어일 뿐 특별한 의미는 없습니다.

Stéphane Chazelas의 중요한 수정 및 추가에 감사드립니다.

에 있는 single (single: [...]), single operators(single: [...]), single operators(: [...] 등)=셸에서 되지만 operator " " 를 합니다.==는 일부 오래된 셸에서 지원되지 않습니다.

에서는, 「[...]」를 사용해도 .= ★★★★★★★★★★★★★★★★★」==오래된 껍질이나 새 껍데기로요.

편집: 다음 사항도 주의해 주십시오.bash에서는 가능한 한 큰 괄호[...]를 사용합니다.이는 단일 괄호보다 안전하기 때문입니다.그 이유를 다음 예에서 설명하겠습니다.

if [ $var == "hello" ]; then

$var가 늘 또는 빈 경우 스크립트는 다음과 같이 표시됩니다.

if [ == "hello" ]; then

개의 괄호를 하거나 항상변수 주변를 붙이는 입니다."$var" 괄호를 이 더 .) 이중 괄호는 방어적인 코딩 연습에 적합합니다.

[[는 bash "bash " "bash "bash "[명령어를 입력합니다.

http://mywiki.wooledge.org/BashFAQ/031 http://mywiki.wooledge.org/BashGuide/TestsAndConditionals

sh에 쓰는 것이 POSIX sh를 합니다.[[.

  • [는 입니다.builtin printf.printfdisplay.에서는 commandsbash 구문과 됩니다. ★★★★★★★★★★★★★★★★★.].Bash가 은 Bash뿐입니다.[( / COMMANDS ) (man bash / SHEL BUILTIN COMMANDS )
  • [[는 입니다.keyword 조건부 컨텍스트.bash 들어갑니다. ★★★★★★★★★★★★★★★★★.]] / / ( man bash / SHEL GRAMMAR / compoundcommands ) ( man bash / SHEL GRAMMARM / )

순서대로 bash는 다음과 같이 해석하려고 합니다.구문 키워드> 사용자 에일리어스> 빌트인 함수> 사용자 함수> $PATH 명령어

type [  # [ is a shell builtin
type [[  # [[ is a shell keyword
type ]  # bash: type: ]: not found
type ]]  # ]] is a shell keyword
compgen -k  # Keywords: if then else ...
compgen -b  # Builtins: . : [ alias bg bind ...
which [  # /usr/bin/[
  • [도가느느 느느느다다<=는 더 많은 구문 분석 코드를 실행하는 것 같습니다., Syscall'로 됨)을 .
  • [[문맥을 시작함에 따라 인간도 구문적으로 해석하기가 쉬워집니다.에 대해서는, 「산술조건」을 사용하는 것을 .((.
time for i in {1..1000000}; do [ 'a' = 'b' ] ; done  # 1.990s
time for i in {1..1000000}; do [[ 'a' == 'b' ]] ; done  # 1.371s

time for i in {1..1000000}; do if [ 'a' = 'a' ]; then if [ 'a' = 'b' ];then :; fi; fi ; done  # 3.512s
time for i in {1..1000000}; do if [[ 'a' == 'a' ]]; then if [[ 'a' == 'b' ]];then :; fi; fi; done  # 2.143s

strace -cf  bash -c "for i in {1..100000}; do if [ 'a' = 'a' ]; then if [ 'a' = 'b' ];then :; fi; fi  ; done;"  # 399
strace -cf  bash -c "for i in {1..100000}; do if [[ 'a' == 'a' ]]; then if [[ 'a' == 'b' ]];then :; fi; fi  ; done;"  # 399

를 사용하는 것을 추천합니다.[[: posix 호환성에 대해 명시적으로 신경 쓰지 않으면 그렇지 않음을 의미하므로 그렇지 않은 스크립트에 대해 "더 많은" 호환성을 갖는 것에 신경 쓰지 마십시오.

Light Regex 매칭을 위해 이중 대괄호를 사용할 수 있습니다. 예:

if [[ $1 =~ "foo.*bar" ]] ; then

(사용 중인 bash 버전이 이 구문을 지원하는 경우)

Bash 매뉴얼에 기재되어 있습니다.

[ ] 와 함께 사용하는 경우, '<' 및 '>' 연산자는 현재 로케일을 사용하여 사전 편찬적으로 정렬합니다.test 명령어는 ASCII 순서를 사용합니다.

( test 명령어는 [ ]와 동일합니다).

언급URL : https://stackoverflow.com/questions/13542832/difference-between-single-and-double-square-brackets-in-bash

반응형