Bash 스크립트에 2개의 정수가 있다고 가정합니다.
value1=5
value2=3
그렇다면 테스트할 때 왜 큰따옴표를 사용해야 할까요? 예를 들어:
if [[ "$value1" -eq "$value2" ]]
왜 다음을 사용하지 않습니까?
if [[ $value1 -eq $value2 ]]
나에게 큰따옴표는 아무런 의미가 없습니다.
답변1
실제로 여기에는 따옴표가 필요하지 않습니다. 이는 따옴표가 없는 변수를 사용해도 안전한 몇 안 되는 경우 중 하나입니다. 다음을 통해 확인할 수 있습니다 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!
위에서 볼 수 있듯이 인용된 테스트 버전과 인용되지 않은 테스트 버전은 bash에 의해 정확히 동일한 내용으로 구문 분석됩니다. 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!
이전 구성과 달리 이 [ ]
구성에는 [[ ]]
참조가 필요합니다.
인용이 필요한 시기와 이유에 대해 자세히 알아보는 데 도움이 되는 몇 가지 유용한 링크:
답변2
큰따옴표가 필수는 아니지만 이를 사용하는 이유는 다음과 같습니다.
- 모범 사례/습관: 있음이것필수는 아니지만 일반적으로 큰따옴표로 사용됩니다.예우연한 분사를 피하기 위해.
value1
합계 는 가변적이기 때문에value2
그 합계에 무엇이 포함되어 있는지 알 수 없습니다. 그렇지 않으면 "왜 확인하는 대신 변수에 신경을 쓰나요if [[ 5 -eq 3 ]]
? 아니면 더 나아가if
5가 3이 아니라는 것을 이미 알고 있는데 왜 신경 쓰나요? 일반적으로 방어적인 입장을 취하는 것이 더 좋습니다. (실제로 그렇습니다) 단어 에서는 분할이 발생하지 않지만[[
단어 분할이 발생합니다.아니요무슨 일이 일어나는지는 드뭅니다. 포인트 1을 다시 참조하세요. )
답변3
분사.
이 예는 거의 발생하지 않습니다.하지만 그건 가능해, 따라서 방어적으로 코드를 작성하려면 따옴표를 사용하여 트랙을 가리십시오.
$ 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 ']'
아.
답변4
너가 확실히 맞아!
이중 괄호 안의 따옴표는 적어도 이 경우에는 전혀 의미가 없습니다.
하지만 저는 매일 큰따옴표를 사용하기 때문에 - 특히 단일 대괄호 표현식, 함수 및 스크립트에 매개변수 전달, 때로는 변수 할당(간단한 선언에는 전혀 쓸모가 없음)의 경우 -어떤 사람들은, 적어도 나는 본능적으로 변수 확장 주위에 큰따옴표를 쓰는 것 같아요..
큰따옴표는 보안감을 줄 수 있습니다. 큰따옴표가 있는 곳으로 돌아가는 것과 같습니다. - D. 쿠머
일을 하면 얻을 수 있는 이점따라서 당연히 큰따옴표를 사용하십시오.- 하지만 말이 되는 경우에만 - Bash를 처음 접하는 동료도 배울 수 있습니다.보다 안정적인 스크립트를 작성하는 방법. 또한 다음과 같은 사실을 강조합니다.Bash를 사용한 데이터 처리 기술자세히 알아보기데이터 스트림(변수 포함)을 필드 구분 기호로 구분하고 필터를 통해 파이프합니다.. 스트림에서 데이터 덩어리를 분리하면,큰따옴표로 묶으세요!
또 다른 이점은 큰따옴표로 묶인 문자열이 있는 bash 스크립트의 가독성이 높다는 것입니다.코드 강조 편집기에서.