어떤 상황에서 Bash 변수를 큰따옴표로 묶어서는 안 되나요? [복사]

어떤 상황에서 Bash 변수를 큰따옴표로 묶어서는 안 되나요? [복사]

[[...]]inside 와 같이 Bash에서 변수를 확장할 때나 변수 할당의 오른쪽에 사용할 때 큰따옴표가 필요하지 않은 상황이 여러 가지 있다는 것을 알고 있습니다 .

변수 인용에 대해 읽을 때 큰따옴표가 필요하지 않은 경우가 드물기 때문에 어디에서나 큰따옴표를 사용하는 것이 더 낫다는 말을 자주 듣습니다.

어떤 상황에서 인용 행위가 바람직하지 않습니까? 참조가 필요하지 않은 상황을 말하는 것이 아니라 참조 변수가 무언가의 작동을 적극적으로 방해하는 상황을 말하는 것입니다.

답변1

빈 변수를 사라지게 하려면(빈 문자열을 유지하는 것과는 반대로) 인용하지 마십시오.

verbose=
[[ some_condition ]] && verbose=-v

# ...later...

some_program $verbose some_args

변수에 공백으로 구분된 인수가 포함되어 있고 쉘이 이를 별도의 단어로 처리하도록 하려면 인용하지 마십시오.

exclude_file=
[[ -s excludelist.txt ]] && exclude_file='--exclude excludelist.txt'

# ...later...

rsync -avP $exclude /path/to/source/ remote:target

일반적인 접근 방식은 항상 큰따옴표를 사용합니다.왜 당신이 그것을 원하지 않는지 알지 않는 한.

답변2

쉘이 "아, 이건 전체가 아니라 개별 요소입니다!"라고 생각하게 하려는 경우 인용을 피하는 것이 바람직합니다. 이와 같은 것은 배열에 매우 유용합니다.

bash-4.3$ var="one two three"
bash-4.3$ arr=( $var  )
bash-4.3$ for i in "${arr[@]}"; do echo "$i"; done
one
two
three

특히 위의 예시와 같은 배열을 생성할 때 유용합니다. 나는 Ubuntu 작업 공간의 실제 주소를 열거할 때 개인적으로 이 방법을 사용합니다(정확한 용어는 뷰포트이며 X, y와 같은 좌표 형식을 사용하지만 완전히 다른 이야기입니다).

또 다른 방법은 변수를 별도의 항목으로 처리해야 하는 다른 명령에 변수를 제공하는 것입니다. 비교하다:

bash-4.3$ bash -c 'for item; do echo $item; done' sh "$var"
one two three
bash-4.3$ bash -c 'for item; do echo $item; done' sh $var
one
two
three

주석에 언급된 문제를 해결하기 위해 이러한 예제는 "예기치 않은 입력"과 함께 사용하기 위한 것이 아니라 제어된 환경에서 사용하기 위한 것입니다. 또한 set noglob전역 일치를 피하려는 경우에도 이를 사용할 수 있지만, 다시 말하지만 일부 문자열 조합(예: 데스크탑 뷰포트의 숫자 값)에 대한 배열을 생성하려는 경우에는 전혀 위험하지 않습니다 glog. 실제 사용자 입력을 처리하는 경우 이 질문의 주제가 아닌 따옴표를 사용해야 합니다.

답변3

[] = 내장, 휴대성 향상

[[]] = 복합 명령, 추가된 기능

여러 플랫폼에서 들여쓰기가 공유되는 스크립트를 생성할 때 단일 대괄호를 사용하는 것이 좋습니다.

관련 정보