[[]] 테스트에서 큰 따옴표를 사용하는 이유는 무엇입니까? 들면 다음과 같습니다. if [[ “$value1” -eq “$value2”

bash 스크립트에 2 개의 정수가 있다고 가정 해 봅시다.

value1=5
value2=3

그렇다면 왜 테스트 할 때 큰 따옴표를 사용해야합니까? 예를 들면 다음과 같습니다.

if [[ "$value1" -eq "$value2" ]]

왜 다음을 사용하지 않습니까?

if [[ $value1 -eq $value2 ]]

나에게 큰 따옴표는 의미가 없습니다.



답변

단어 분리.

이 예제는 매우 불가능 하지만 가능 하기 때문에 방어 적으로 코딩하려면 트랙을 따옴표로 묶으십시오.

$ set -x
$ value1=5
+ value1=5
$ value2=3
+ value2=3
$ [ $value1 -eq $value2 ]
+ '[' 5 -eq 3 ']'

좋아, 지금까지는 모두 좋아 렌치를 기어에 넣습니다.

$ IFS=456
+ IFS=456
$ [ $value1 -eq $value2 ]
+ '[' '' -eq 3 ']'
bash: [: : integer expression expected

죄송합니다.

$ [ "$value1" -eq "$value2" ]
+ '[' 5 -eq 3 ']'


답변

실제로 여기에 따옴표가 필요하지 않습니다. 인용되지 않은 변수를 사용하는 것이 안전한 경우는 매우 드 few니다. 당신은 이것을 확인할 수 있습니다 set -x:

$ var1=""
$ var2="3"
$ set -x
$ if [[ $var1 -eq $var2 ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!
$ if [[ "$var1" -eq "$var2" ]]; then echo "match!"; else echo "no match!"; fi
+ [[ '' -eq 3 ]]
+ echo 'no match!'
no match!

위에서 볼 수 있듯이 따옴표로 묶인 인용 부호와 인용 부호가없는 버전의 테스트는 똑같이 해결됩니다. 연산자 zsh를 지원하는 다른 쉘에서도 마찬가지입니다 [[ ]].

더 이식성이 좋은 경우 는 아닙니다[ ] .

$ if [ $var1 -eq $var2 ]; then echo "match!"; else echo "no match!"; fi
+ '[' -eq 3 ']'
sh: [: -eq: unary operator expected
+ echo 'no match!'
no match!

[ ]구조는 달리 [[ ]]하나, 인용이 필요 없습니다.


인용이 필요한시기와 이유에 대한 자세한 정보를 제공하는 유용한 링크 :


답변

큰 따옴표가 필요하지 않지만 사용하는 이유는 다음과 같습니다.

  • 모범 사례 / 습관 : 경우에는 필요하지 않지만 일반적으로 큰 따옴표 의도하지 않은 단어 분리를 피하는 것입니다.
  • 때문에 value1value2변수, 그리고 당신이 포함 된 내용을 알고하지 않을 수 있습니다. 그렇지 않으면 “왜 검사하지 않고 변수로 귀찮게 if [[ 5 -eq 3 ]]하는가? 더 자세히 살펴보면 if5가 3과 같지 않다는 것을 이미 알고있을 때 왜 귀찮게 하는가?” 단어 분리는 발생 [[하지 않지만 단어 분리가 발생 하지 않는 경우는 드물다.

답변

귀하의 질문과 직접 ​​관련이 없지만

if (($ value1 == $ value2)); 그때

숫자를 비교할 때 따옴표를 사용할 필요가 없습니다.


답변

너가 확실히 맞아!

이중 대괄호 안의 인용은 적어도이 경우에는 의미가 없습니다.

그러나 매일 큰 따옴표를 사용하기 때문에-특히 단일 대괄호 표현식, 함수 및 스크립트에 인수 전달, 때로는 변수 할당 (간단한 분리에는 쓸모가 없음)- 적어도 일부 사람들은 추측합니다. 변수 확장을 본능적으로 큰 따옴표로 묶습니다 .

큰 따옴표는 절약 감을 줄 수 있습니다. 큰 따옴표가있는 집에 오는 것과 같습니다. -D. Kummer

큰 따옴표를 결과적으로 그리고 이해하기 쉬운 방식 으로하는 것의 이점은 , 이해가 되겠지만, bash를 처음 접하는 동료들은 보다 안정적인 스크립트를 작성하는 방법을 배울 수 있다는 것 입니다. 또한 bash를 사용한 데이터 처리 기술은 필드 구분 기호로 데이터 스트림 (변수 포함)을 분리하고 필터를 통해 파이프하는 것 보다 더 중요 하다는 사실을 강조합니다 . 데이터 청크를 스트림에서 분리하자마자 큰 따옴표로 묶으십시오!

또 다른 이점은 코드 강조 편집기 내에서 큰 따옴표로 묶인 문자열이 있는 bash 스크립트의 가독성이 향상 될 수 있다는 것입니다 .


답변