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 확장:
[
POSIX 인가요?[[
Korn 쉘에서 영감을 받은 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 버전이 이 구문을 지원하는 경우)
[ ] 와 함께 사용하는 경우, '<' 및 '>' 연산자는 현재 로케일을 사용하여 사전 편찬적으로 정렬합니다.test 명령어는 ASCII 순서를 사용합니다.
( test 명령어는 [ ]와 동일합니다).
언급URL : https://stackoverflow.com/questions/13542832/difference-between-single-and-double-square-brackets-in-bash
'programing' 카테고리의 다른 글
Unix 에서는, 현재의 디렉토리와 그 아래에 있는 모든 것을 어떻게 삭제합니까? (0) | 2023.04.11 |
---|---|
xy 산점도에서 열 값에 따라 점을 색칠하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
트리거와 DataTrigger의 차이점은 무엇입니까? (0) | 2023.04.11 |
ContentControl과 ContentPresenter의 차이점은 무엇입니까? (0) | 2023.04.11 |
큰 테이블의 VARCHAR 컬럼 크기를 늘릴 때 문제가 발생합니까? (0) | 2023.04.11 |