배열 변수를 통해 프로그램에 매개변수 전달

배열 변수를 통해 프로그램에 매개변수 전달

참고: 아래 질문이 포함되어 rsync있지만아니요에 대한 질문입니다 rsync. zsh 배열에 관한 질문입니다.


EXCLUDES이렇게 변수를 초기화하면

EXCLUDES=( --exclude=/foo --exclude=/bar --exclude=/baz )

그런 다음 명령을 실행할 때

rsync -a $EXCLUDES / /some/target

/foo...그럼 , /bar및 가 /baz실제로 에 복사되지 않은 것을 확인했습니다 /some/target.

EXCLUDE_ITEMS하지만 이제 이렇게 말하자

EXCLUDE_ITEMS=( /foo /bar /baz )

...이렇게 EXCLUDE를 초기화합니다.

EXCLUDES=()
for item in $EXCLUDE_ITEMS
do
    EXCLUDES+=( "--exclude='$item'" )
done

...또는 이런 것

EXCLUDES=( $(for item in $EXCLUDE_ITEMS; do echo "--exclude='$item'"; done) )

...그래서 두 경우 모두 실행한 후

rsync -a $EXCLUDES / /some/target

...이제 제외된 디렉토리는 다음과 같습니다.아니요양도 대상에서 제외됩니다.

EXCLUDES(터미널에 입력되는) 명령줄은 모두 동일하기 때문에 명시적으로 초기화한 명령줄과 반복을 통해 초기화한 명령줄에는 차이가 있다고 결론을 내릴 수 있는데, EXCLUDE_ITEMS그게 뭔지는 알 수 없다.

런타임 시 후자가 실제로 제외되도록 EXCLUDE프로젝트를 초기화하는 방법EXCLUDE_ITEMS

rsync -a $EXCLUDES / /some/target

추신: 사실, 내가 실행하면

eval "rsync -a $EXCLUDES / /some/target"

...위에 표시된 루프 기반 방법 중 하나로 초기화된 경우 여기에 지정된 디렉터리는 EXCLUDES실제로 필요에 따라 제외됩니다 .forEXCLUDES

답변1

문제는 을 작성하면 "--exclude='$item'"제외 패턴에 작은따옴표를 추가한다는 것입니다. 따라서 등을 제외하고 있지만 '/foo'이름이 작은따옴표로 시작하고 끝나는 파일이 없을 것입니다.

당신은 작성해야

EXCLUDES+=( "--exclude=$item" )

또는 zsh이므로 큰따옴표가 필요하지 않습니다. 그냥 쓰세요.

EXCLUDES+=( --exclude=$item )

또는 zsh이므로 루프가 필요하지 않습니다.^매개변수 확장 옵션:

rsync -a --exclude=$^EXCLUDE_ITEMS …

ksh 또는 bash에서는 루프와 큰따옴표가 필요합니다.

EXCLUDES=()
for item in "${EXCLUDE_ITEMS[@]}";  do
  EXCLUDES+=( "--exclude=$item" )
done
rsync -a "${EXCLUDES[@]}" …

관련 정보