bash는 내장 변수와 작은따옴표를 사용하여 배열에 값을 추가합니다.

bash는 내장 변수와 작은따옴표를 사용하여 배열에 값을 추가합니다.

나는 이 주제가 완전히 명확하다고 확신합니다 :) 농담입니다. 제가 찾은 문제의 일부는 검색어를 작성하는 것입니다.

배열을 인수로 사용하여 bash 스크립트에서 명령을 실행할 때 행운이 있었습니다.

예를 들어 rsync를 호출하고 다음과 같은 배열을 만들었습니다(스포일러 경고 - 중복 변수는 나중에 참조됩니다).

#!/usr/bin/env bash
set -euo pipefail
rf=.rsync-filter
srcff="/home/roger/home$rf"

hm=/home/roger
syncto=/tmp/to-remote/home

rsarg=(-avv --prune-empty-dirs --stats)
rsarg+=(--dry-run)

rsync "${rsarg[@]}" "$hm" "$syncto/"  #works

exit

문제가 있는 부분은 $srcff 변수를 필터 규칙에 추가하고 이를 rsarg 배열에 추가하는 것입니다.

rsarg+=("--filter='merge $srcff'") # no dice
# or this
rsarg+=("--filter='merge ${srcff}'") # sad trombone

실행한 후 다음을 얻습니다.

$ ./home-sync-simple
Unknown filter rule: `'merge /home/roger/home.rsync-filter''
rsync error: syntax or usage error (code 1) at exclude.c(904) [client=3.1.1]

배열 외부의 rsync 라인에 병합 규칙을 추가하고 포함된 변수를 빼면 작동하게 할 수 있습니다.

rsync "${rsarg[@]}" --filter='merge /home/roger/home.rsync-filter' "$hm" "$syncto/"

위의 필터를 배열 외부의 변수로 바꾸는 것도 같은 방식으로 실패합니다.

rsync "${rsarg[@]}" "--filter='merge $srcff'" "$hm" "$syncto/" 

나는 다른 많은 변형을 시도했으며 실제로 작동하는 변형을 제외하고 가능한 모든 변형을 가정하고 있습니다. 때로는 "예기치 않은 필터 규칙 끝: 병합" 및 기타 상황이 발생합니다. 간결함을 위해 위의 버전이 정확에 더 가깝다고 생각하기 때문에 이러한 버전을 제외했습니다(그는 초조하게 말했습니다). 매개변수를 너무 적거나 너무 많이 전달한 것 같습니다.

미리 감사드립니다!

답변1

이것이 작동하는 경우:

rsync "${rsarg[@]}" --filter='merge /home/roger/home.rsync-filter' ...

그러면 당신은 그럴 것 같아요아니요작은따옴표를 추가하고 싶습니다 rsync. 여기에서는 조개껍데기가 rsync보기도 전에 그것을 먹어치웁니다. 다른 예에는 따옴표 안에 따옴표가 포함되어 있으므로 내부 따옴표는 보존되어 rsync볼 수 있도록 전달됩니다.

따라서 배열을 만들 때 작은따옴표를 건너뜁니다.

rsarg+=("--filter=merge $srcff")

쉘의 관점에서 볼 때 등호에는 특별한 것이 없으며 다음 부분은 앞 부분과 다르게 처리될 필요가 없습니다. or 또는 Even 과 동일합니다 --foo=bar.--foo="bar""--foo=bar"--fo"o=ba"r

관련 정보