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 확장:
[
POSIX 인가요?[[
KornShell에서 영감을 받은 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)에서 도입되었습니다.
★★★,
[ … ]
, , , , 입니다.[[ … ]]
[[ … ]]
[ … ]
,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
'programing' 카테고리의 다른 글
두 개의 목록 결합 및 중복 제거, 원래 목록의 중복 제거 안 함 (0) | 2023.04.26 |
---|---|
기본값 대응:다음 키보드 버튼을 누른 후 다음 텍스트 입력을 선택하는 방법은 무엇입니까? (0) | 2023.04.26 |
ThreadPool 사용.ASP의 QueueUserWorkItem.고트래픽 시나리오에서의 NET (0) | 2023.04.21 |
인수 없이 펑크를 무효화하다 (0) | 2023.04.21 |
grep에서 .svn 디렉토리 제외 (0) | 2023.04.21 |