programing

Bash에서는 대괄호[ ]가 대괄호[ ]보다 좋습니까?

closeapi 2023. 4. 21. 20:53
반응형

Bash에서는 대괄호[ ]가 대괄호[ ]보다 좋습니까?

는 최근 에서 이 코드 를 통해 이 코드가 사용되었다고 했습니다.[[ ]]보다 [ ]조조같과

if [ "`id -nu`" = "$someuser" ] ; then
     echo "I love you madly, $someuser"
fi

그는 근거를 제시하지 못했다.있어요?

[[놀라운 일도 적고 일반적으로 사용하기 더 안전합니다.그러나 POSIX는 기능을 지정하지 않고 일부 셸만 지원합니다(bash 외에 ksh도 지원한다고 들었습니다).를 들어, 이렇게 하면 .

[[ -e $b ]]

파일 존재 여부를 테스트합니다. ,가 있으면[ 인용을 $b"a*"서 (어디서)[[말 그대로 받아들인다). 하면 좋을까 것과 가 있다.[는 외부 프로그램일 수 있으며 다른 모든 프로그램과 마찬가지로 인수를 정상적으로 수신할 수 있습니다(빌트인일 수도 있지만, 아직 이 특별한 처리가 없습니다).

[[또한 정규 표현 매칭과 같은 다른 멋진 기능도 있습니다.=~연산자와 함께 C형 언어로 알려져 있습니다.다음은 이에 대한 좋은 페이지입니다.테스트 및 ? 및 Bash 테스트의 차이점은 무엇입니까?

동작의 차이

Bash 4.3.11에서의 차이점:

  • POSIX vs Bash 확장:

  • 일반 명령 vs 매직

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

      ]에 불과합니다.[.

      Ubuntu 16.04 에서는 실제로 실행 가능한 파일이 있습니다./usr/bin/[coreutils에 의해 제공되지만 Bash 빌트인 버전이 우선됩니다.

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

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

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

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

    [명령어입니다.[[는 키워드입니다.shell builtin 키워드와 shell 키워드의 차이점은 무엇입니까?

  • <

    • [[ 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' ]]. 없습니다. true. 따옴표는 필요 없습니다.
    • 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로 되어 않습니다( 3.2와의 등).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에 이 있습니다.[[ ]]내가 본 건축물이요.

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

  • 휴대성을 잃다
  • 독자로 하여금 또 다른 배쉬 확장의 복잡함을 배우도록 강요한다. [는 이름이 이상한 일반 명령어일 뿐 특별한 의미론은 없습니다.

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

[[ ]]에는 더 많은 기능이 있습니다.자세한 것에 대하여는, 「Advanced Bash Scripting Guide」(상세 배쉬 스크립팅 가이드), 특히 제7장의 확장 테스트명령어 섹션을 참조해 주세요. 테스트

바와 같이, 덧 incident incident incident incident incident incident incident incident incident incident incident incident incident incident incident incident incident incident incident[[ ]]는 ksh88(1988년판 KornShell)에서 도입되었습니다.

Google 스타일 가이드를 따르고 싶은 경우:

★★★,[ … ] , , , , 입니다.[[ … ]]

[[ … ]][ … ],test ★★★★★★★★★★★★★★★★★」/usr/bin/[.

[[ … ]]이 「경로명」의 「경로명」의 「경로명」의 「경로명」의 「경로명」의 「경로명」의 「경로명」의 「경로명」의 「경로명」의 사이에 발생하지 않기 때문에, 가 저감 됩니다.[[ ★★★★★★★★★★★★★★★★★」]] 또.[[ … ]]는 정규 조회를 만, 「 」는 「 」입니다.[ … ]지지않않않않

# This ensures the string on the left is made up of characters in
# the alnum character class followed by the string name.
# Note that the RHS should not be quoted here.
if [[ "filename" =~ ^[[:alnum:]]+name ]]; then
  echo "Match"
fi

# This matches the exact pattern "f*" (Does not match in this case)
if [[ "filename" == "f*" ]]; then
  echo "Match"
fi
# This gives a "too many arguments" error as f* is expanded to the
# contents of the current directory
if [ "filename" == f* ]; then
  echo "Match"
fi

자세한 내용은 http://tiswww.case.edu/php/chet/bash/FAQ의 E14를 참조하십시오.

비교기, 테스트, 브래킷 또는 이중 브래킷 중 어느 것이 가장 빠릅니까?

이중 괄호는 "compound command"로, 테스트와 단일 괄호는 셸이 내장되어 있습니다(실제로는 같은 명령어입니다).따라서 싱글 브라켓과 더블 브라켓은 다른 코드를 실행합니다.

테스트 및 싱글브래킷은 개별 명령어 및 외부 명령어로 존재하기 때문에 가장 휴대성이 높습니다.다만, 리모트 최신 버전의 BASH 를 사용하고 있는 경우는, 이중 괄호가 서포트되고 있습니다.

Bash "라는 태그가 달린 에서 " Bash"는 피해야 한다는 모든 [[]]아아아!

반대인 것은 Bourne 셸하려면 , 「Bourne」의 「Bash」를 피하는 것이 .Bash가 아니더라도 Bourne 호환 셸에서 동작하는 셸 스크립트를 작성하려면[[]] 셸 엄밀하게 에는 (POSIX의 경우)를 dash표준에서 요구하는 국제화 지원이 부족하기 때문에 불완전한 POSIX 구현이지만 bash, ksh, zsh 등에서 볼 수 있는 많은 비 POSIX 구성 중 전부는 아니지만 대부분에 대한 지원이 부족합니다.)

본 또 bash의 될 수 있다. 은 바로 bash의 가정이다.[[]]특별한 규칙을 가지고 있기 때문에 배워야 합니다.[]하다그것은 다시 사실이지만(그리고 산틸리 씨는 모든 차이를 보여주는 영수증을 가져왔지만), 그 차이가 좋은지 나쁜지는 다소 주관적이다.롭게 사용할 수 있다고 생각합니다.() 그룹화,&& ★★★★★★★★★★★★★★★★★」||의 경우, " " 입니다.< ★★★★★★★★★★★★★★★★★」>비교 및 따옴표로 묶지 않은 파라미터 확장.마치 기존의 명령어 셸이 아닌 프로그래밍 언어에서와 같이 표현식이 작동하는 폐쇄된 세계와 같습니다.

가 본 이 없는 는 이 입니다.[[]]한다.$(())는 POSIX에 의해 지정되며 따옴표로 둘러싸지 않은 괄호 및 부울 연산자와 부울 연산자(여기에서는 어휘 비교 대신 숫자를 수행합니다)도 사용할 수 있습니다.기본적으로 이중 괄호 문자가 표시될 때마다 동일한 따옴표 차폐 효과를 얻을 수 있습니다.

와 그 도 (Bash)를 사용합니다.(()) – 도 – – – –$ – C-style 중 for루프 헤더 또는 산술 연산을 실행하기 위한 환경. (POSIX)

때문에 이 문제를 선호하는 데는 몇가 있습니다.[[]];또한피해야할이유가있습니다.이는사용자의환경에적용될수도있고적용되지않을수도있습니다.당신의 동료에 대해 말하자면, "우리 스타일 가이드가 그렇게 말한다"는 것은 타당하지만, 스타일 가이드가 추천하는 이유를 알고 있는 사람에게도 이야기를 듣고 싶습니다.

「 」를 사용할 수 .[[autotools configure.ac에 접속해 주세요.와 다른 있기 에 괄호를 .test[ ★★★★★★★★★★★★★★★★★」[[이해 주세요.-- 「 」[같은 프로그램입니다.

한마디로 다른 프로세스를 분리하지 않기 때문에 [[가 더 좋습니다.다른 프로세스를 포크하기 때문에 이중 브래킷보다 느린 브래킷도 단일 브래킷도 없습니다.

[ ] 이중 괄호는 특정 버전의 SunOS에서는 지원되지 않으며 내부 함수 선언은 다음과 같이 전혀 지원되지 않습니다.

GNU Bash 버전 2.02.0 (1) 릴리즈(sparc-sun-solaris2)6)

이 문제가 더 빨리 제기되지 않은 것에 놀랐습니다만, 다음 사항을 고려해 주십시오.

$ n=5
$ [[ $n -gt 0 ]] && echo $n is positive
5 is positive
$ n=foo
$ [[ $n -gt 0 ]] && echo $n is positive
$ [ "$n" -gt 0 ] && echo $n is positive
bash: [: foo: integer expression expected

가 표시되지 .[[ $n -gt 0 ]]「」를 렌더링 .[[완전히 사용할 수 없습니다.너무 것 거예요.[[, 저는 ,, 히, 는, 는, 는, 합, 합, 합, ,, ,, ,, ,, ,, ,,[[이 때문에

언급URL : https://stackoverflow.com/questions/669452/are-double-square-brackets-preferable-over-single-square-brackets-in-b

반응형