명령에 따옴표가 포함 된 Bash 변수 (문자열)를 어떻게 사용합니까?


답변:


54

짧은 대답 : BashFAQ # 50을 참조하십시오 ( "명령을 변수에 넣으려고하지만 복잡한 경우는 항상 실패합니다!").

긴 대답 : 명령 (또는 명령의 일부)을 변수에 넣은 다음 원래대로 되 돌리는 것은 복잡합니다. 쉘이 명령 행에서 변수를 확장 할 때 변수가 큰 따옴표 안에 있으면 구문 분석되지 않습니다. 따옴표로 묶지 않은 경우 공백이 인수 구분으로 구문 분석되지만 따옴표 및 이스케이프는 구문 분석되지 않습니다. 두 경우 모두 변수 값에 따옴표를 넣으면 아무 효과가 없습니다.

일반적으로 이런 종류의 작업을 수행하는 가장 좋은 방법은 간단한 텍스트 변수 대신 배열을 사용하는 것입니다.

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2

거룩한 Jezus 작동합니다!
Slawomir


-2

문제가 보이지 않습니다.

$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"

어쩌면 값을 다시 인용해야 할 수도 있습니다.

$ rsync "$FLAGS" dir1 dir2

5
echo당신이 생각하는 것을 보여주지 않습니다. 시도 printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"왜 둘 다 이러한 옵션 작업 볼 수 있습니다.
Gordon Davisson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.