2013-06-21 3 views
4

같은 것을 선호하는 이유는 지금이 :(())는 그냥 호기심

while [[ $number -lt 10 ]] 

while (($number < 10)) 

이상 그들은 똑같은 일을하는 것처럼 보입니다. 나는 어쩌면 그들 중 하나 또는 아마도 이식 가능성에 대한 우려가 [[ ]]과 관련하여 궁금합니다.

+0

짧은 답변 : 그것은 가능의 경우'(())'_ALWAYS_가'[]'선호입니다 ...하지만 사람들의 상당수는 단순히 존재 모른다. –

답변

4

어느 쪽도 표준이 아니므로 이식성은 문제가되지 않습니다.당신이 단순한 비교를 수행하는 경우,

if [[ $number -lt 10 ]] 

두 번째에서 $을 (드롭 할 수있는 기능을 제외하고

if ((number < 10)) 

betwee 약간의 차이가 모든 문자열을 변수로 가정하고 역 참조하기 때문에) 및 가독성.

조건부을 결합 연산 및 비 산술 시험 때 [[...]]을 선호 있습니다

if ((number*2 < 10-delta)) 
: 당신의 비교가 약간의 계산을 포함하는 경우

if [[ $number -lt 10 && $file = *.txt ]] 

if ((number < 10)) && [[ $file = *.txt ]] 

대 당신은 아마 ((...))를 선호

대 n eedlessly 복잡한

if [[ $((number*2)) -lt $((10-delta)) ]] 
0

(())은 모든 간격 제한을 적용하지 않는 한 당신은 내가 (())을 사용하여 선호 woud 모든 복잡한 산술 연산자하지만 [[]]은 제한 비교 man test

에 정의 허용을 사용할 수 있습니다. 당신은 아주 잘 사용할 수 있습니다

while ((number<10)) 

또는

while ((number*2<10)) 

몇 시간 전
+1

[[테스트와 동일하지 않습니다. –

+0

@depesz : 동의하지는 않지만 테스트에서 사용하는 연산자가 허용됩니다. – anubhava

+0

예, [[]]은 테스트 기능에 * 제한되어 있지 않습니다. 더 많은 것을 할 수 있습니다. –

3

당신이 일반적이었다 당신이 프로그램을 "테스트"를 사용하고 비교의 어떤 종류를 가지고 싶어 "[".

그래서 당신 같은 표현했다 : 기본적으로

if [ ..... ]; then 

테스트 asciibetically 비교를, 당신은 수치 비교를 원한다면, 당신은 -lt/-gt 및 이와 유사한을 사용했다.

그러면 bash는 자체 테스트 엔진을 갖게되었습니다. 그것을 사용하려면 [[[. '비교가 떠들썩한 파티에서 자신을 수행 한 것을 제외하고,

if [[ ... ]]; then 

와 동일한 기능을 수행하고, didn를 :

if [ ... ]; then 

과 같이 다시 작성할 수 있습니다 :

그래서 동일한 구문 당신은 이전했다 테스트 프로그램의 fork/exec가 필요합니다.

이제 외부 프로그램을 호출하지 않으므로 숫자를 비교하는 다른 방법을 추가하는 것이 더 간단합니다. 그러므로 (())가 나타났다.

특정 이점이 있지만 일반적으로 간과되는 것은 수치 을 부과한다는 것입니다. 당신은 같은 것을 할 수 있다는 것을 의미

:

i=1 
((i++)) 
echo $i # will return 2 

길고도 짧은 이야기 - 비교를 위해, 그것은 많은를 중요하지 않습니다. 그러나 그것은 남자 bash에서 (()와 [[])에 대해 더 많은 것을 배우는 데 드는 돈입니다.