등호와 중괄호가 포함된 변수 확장

등호와 중괄호가 포함된 변수 확장

rsync를 사용하고 특정 설정에 따라 파일을 제외하는 스크립트를 작성 중입니다. 형식의 제외 플래그로 끝납니다 --exclude={foo, bar, baz}.

그러나 명령에서 이를 확장하려고 할 때 rsync플래그가 이스케이프된 것을 발견했습니다. Bash 디버거에서 rsync $excludesComes 명령이 rsync '--exclude={foo,bar,baz}'예상대로 작동하지 않는 것을 볼 수 있습니다 . 일부 테스트를 통해 확장 시 , , 또는 rsync --exclude={foo,bar,baz}포함된 문자열이 작은따옴표로 묶인다는 것을 발견했습니다. 생성된 문자열에 대해 eval을 사용하지 않고 이 문제를 해결할 수 있는 방법이 있습니까?={}

답변1

인용할 때 중괄호 확장이 발생하지 않습니다. 또한 (가능한 경우) 변수가 아닌 배열에 매개변수를 저장해야 합니다.

나는 다음이 당신에게 도움이 될 것이라고 생각합니다.

excludes=( $(--exclude={foo,bar,baz}) )
rsync "${excludes[@]}"

답변2

Bash 디버거에서... =, { 또는 }를 포함하는 모든 문자열은 확장 시 작은따옴표로 묶입니다.

xtrace출력( ) 을 참조하는 경우 set -x특수 문자가 포함된 인수를 작은따옴표로 묶어 표시하는 것을 좋아합니다. 출력은 셸에 대한 입력으로 사용할 수 있는 형식입니다.

그러나 이것이 따옴표가 문자열의 일부라는 의미는 아닙니다.

비교하다:

$ echo abc def\ ghi
+ echo abc 'def ghi'
abc def ghi

$ echo abc \'def\ ghi\'
+ echo abc ''\''def ghi'\'''
abc 'def ghi'

내가 알 수 있는 한, 등호가 포함된 문자열을 인용하는 데는 문제가 되지 않습니다.

관련 정보