나는 bash 예제를 읽고 if
있지만 일부 예제는 대괄호로 작성됩니다.
if [ -f $param ]
then
#...
fi
이중 대괄호가있는 기타 :
if [[ $? -ne 0 ]]
then
start looking for errors in yourlog
fi
차이점은 무엇입니까?
답변
[]
posix 쉘 호환 조건 테스트는 단일 입니다.
Double [[]]
은 표준에 대한 확장 []
이며 bash 및 기타 쉘 (예 : zsh, ksh)에서 지원됩니다. 추가 작업 (표준 posix 작업)을 지원합니다. 예를 들어 : ||
대신 -o
정규 표현식과 일치합니다 =~
. 차이점에 대한 전체 목록은 조건부 구문 에 대한 bash 매뉴얼 섹션에서 찾을 수 있습니다 .
[]
쉘에서 스크립트를 이식 가능하게 할 때마다 사용하십시오 . [[]]
조건식을 지원 []
하지 않고 이식 가능하지 않은 경우 사용하십시오 .
답변
행동 차이
Bash 4.3.11에서 테스트 :
-
POSIX vs Bash 확장 :
[
POSIX입니다[[
https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs에 설명 된 Bash 확장 프로그램 ¹입니다.
-
정규 명령 대 마법
-
[
이상한 이름을 가진 일반적인 명령입니다.]
[
추가 인수가 사용되지 않도록 하는 인수입니다 .우분투 16.04는 실제로
/usr/bin/[
coreutils 가 제공 하는 실행 파일을 가지고 있지만 bash 내장 버전이 우선합니다.Bash가 명령을 구문 분석하는 방식에는 아무런 변화가 없습니다.
특히, 경로
<
재 지정이며 여러 명령을 연결&&
하고로 이스케이프하지 않는 한 서브 쉘을 생성 하며 단어 확장은 평소와 같이 수행됩니다.||
( )
\
-
[[ X ]]
X
마술처럼 파싱 하는 단일 구문입니다.<
,&&
,||
및()
특수 처리, 워드 분할 규칙이 다릅니다된다.같은 더 차이도있다
=
하고=~
.Bashese에서 :
[
내장 명령이며[[
키워드입니다 : /ubuntu/445749/whats-the-difference-between-shell-builtin-and-shell-keyword
-
-
<
[[ a < b ]]
: 사전 비교[ a \< b ]
: 같은 상기와.\
필요하거나 다른 명령과 마찬가지로 리디렉션을 수행합니다. 배쉬 확장.expr a \< b > /dev/null
: POSIX에 상응하는 ², 다음을 참조하십시오 : Bash에서 사전 사전 이하의 문자열을 테스트하는 방법은 무엇입니까?
-
&&
과||
[[ a = a && b = b ]]
: 진실하고 논리적 이며[ a = a && b = b ]
:&&
AND 명령 구분자로 구문 분석 된 구문 오류cmd1 && cmd2
[ a = a -a b = b ]
: POSIX³에서는 동일하지만 더 이상 사용되지 않습니다.[ a = a ] && [ b = b ]
: POSIX 및 신뢰할 수있는 제품
-
(
[[ (a = a || a = b) && a = b ]]
: 거짓[ ( a = a ) ]
: 구문 오류,()
서브 쉘로 해석[ \( a = a -o a = b \) -a a = b ]
: 동등하지만()
POSIX에서 사용되지 않습니다.{ [ a = a ] || [ a = b ]; } && [ a = b ]
POSIX 상당 5
-
확장시 단어 분리 및 파일 이름 생성 (분할 + 글로브)
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\? ]
: false, glob 확장이 아님=
와==
모두 동일[
하고[[
있지만,==
배쉬 확장입니다.case ab in (a?) echo match; esac
: POSIX 상당[[ ab =~ 'ab?' ]]
: 거짓 4 , 마법을 잃는다''
[[ ab? =~ 'ab?' ]]
: 진실
-
=~
[[ ab =~ ab? ]]
: POSIX 확장 정규 표현식 일치,?
확장하지 않음[ a =~ a ]
: 구문 오류. bash와 동등한 것은 없습니다.printf 'ab\n' | grep -Eq 'ab?'
: POSIX 동등 (단일 데이터 만)awk 'BEGIN{exit !(ARGV[1] ~ ARGV[2])}' ab 'ab?'
: POSIX 상당.
권장 사항 : 항상 사용하십시오 []
.
[[ ]]
내가 본 모든 구성에 대해 POSIX 등가물 이 있습니다.
당신이 당신을 사용하는 경우 [[ ]]
:
- 휴대 성을 잃다
- 독자가 다른 배쉬 확장의 복잡성을 배우도록 강요하십시오.
[
이상한 의미를 가진 일반적인 명령이며 특별한 의미가 없습니다.
¹ [[...]]
Korn 쉘 의 동등한 구성에서 영감을 받음
² 그러나 a
또는 b
(와 같은 +
또는 index
) 의 일부 값에는 실패하고 10 진수 정수 a
와 같으면 숫자 비교를 수행합니다 b
. expr "x$a" '<' "x$b"
둘 다 해결합니다.
³도의 일부 값 실패 a
나 b
같은 !
나 (
.
bash 3.2 이상에서 4 이며 bash 3.1과의 호환성이 제공되지 않습니다 (와 같이 BASH_COMPAT=3.1
)
5 및 쉘 연산자 ( 및 연산자 또는 / 연산자 와 반대 )가 동일한 우선 순위를 갖기 때문에 그룹화 (여기서 {...;}
명령 그룹을 사용 (...)
하여 불필요한 서브 쉘을 실행 함)는 필요하지 않습니다 . 따라서 동일합니다.||
&&
||
&&
[[...]]
-o
-a
[
[ a = a ] || [ a = b ] && [ a = b ]
답변
조건 테스트를위한 단일 괄호 안에 (예 : […]), single과 같은 일부 연산자 =
는 모든 쉘에서 지원되는 반면, 연산자의 사용은 ==
일부 이전 쉘에서는 지원되지 않습니다.
상태 검사 (예 : [[…]])에 대한 이중 대괄호 안에 사용 사이에는 차이가 없다 =
거나 ==
오래되거나 새로운 쉘있다.
편집 : 나는 또한 참고해야합니다 : bash에서는 가능한 경우 항상 대괄호 [[…]]를 사용하십시오. 단일 대괄호보다 안전하기 때문입니다. 다음 예제를 통해 이유를 설명하겠습니다.
if [ $var == "hello" ]; then
$ var이 null / 비어있는 경우 다음과 같이 스크립트에 표시됩니다.
if [ == "hello" ]; then
스크립트가 깨질 것입니다. 해결책은 큰 괄호를 사용하거나 항상 변수 주위에 따옴표를 묶는 것입니다 ( "$var"
). 이중 괄호가 더 나은 방어 코딩 방식입니다.
답변
[[
bash 키워드와 유사하지만보다 강력합니다. [
명령 입니다.
보다
http://mywiki.wooledge.org/BashFAQ/031 및 http://mywiki.wooledge.org/BashGuide/TestsAndConditionals
POSIX sh를 작성하지 않는 한을 권장 [[
합니다.
답변
다음과 같이 가벼운 정규식 일치에 이중 대괄호를 사용할 수 있습니다.
if [[ $1 =~ "foo.*bar" ]] ; then
(사용중인 bash 버전 이이 구문을 지원하는 한)
답변
배쉬 매뉴얼 은 말한다 :
[[와 함께 사용하면 ‘<‘및 ‘>’연산자는 현재 로케일을 사용하여 사전 순으로 정렬합니다. 테스트 명령은 ASCII 순서를 사용합니다.
(테스트 명령은 []와 동일합니다)