매개변수 목록 작성을 위한 Bash 문자열 연결

매개변수 목록 작성을 위한 Bash 문자열 연결

이것을 고려하면:

PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}

echo는 예상대로 PARMS 문자열을 표시하고 오류를 표시하지 않지만 rsync는 += 추가 옵션이 존재하지 않는 것처럼 자동으로 실행됩니다. 그러나 이는 예상대로 작동합니다.

PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}

나는 bash 따옴표로 뭔가를 엉망으로 만들고 있다고 생각하지만 (항상 문제가 있음) 문자열이 올바르게 작성된 것처럼 보이지만 옵션이 무엇과 왜 무시되고 있는지 잘 모르겠습니다.

답변1

둘 사이에는 다음과 같은 차이점이 있습니다.

PARMS+="... --exclude='.git'"

그리고

... --exclude='.git'

첫 번째에서는 작은 따옴표 자체가 내부 따옴표입니다.그래서 그들은 존재합니다rsync인수로 제공된 대체 텍스트에서. rsync값이 있는 매개변수를 가져옵니다 --exclude='.git'. 두 번째에서 작은따옴표는 작성할 때 쉘에 의해 해석됩니다.아니요내부 따옴표 자체를 rsync볼 수 있습니다 --exclude=.git.

이 경우에는 작은따옴표가 전혀 필요하지 않습니다. .git특수 문자 없이 그 자체로 완벽하게 유효한 쉘 단어이므로 명령에서 문자 그대로 사용할 수 있습니다.

하지만 이런 종류의 일에는 더 좋습니다.대량으로:

PARMS=(-rvu)
PARMS+=(--delete --exclude='.git')
rsync "${PARMS[@]}"

이렇게 하면 명령이 별도의 단어로 구성되고 배열 행을 작성할 때 해석하려는 참조가 무엇이든 사용됩니다."${PARMS[@]}"확장하다인수 자체에 특수 문자나 공백이 포함되어 있더라도 배열의 각 항목을 별도의 인수로 취급하므로 rsync의도한 대로 작성했는지 확인하세요.

답변2

또한@마이클 호머의 답변, 당신은 그것을 사용할 수 있습니다bash 평가 기능:

PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo "$PARMS"
eval "rsync ${PARMS} . "'"${TARGET}"'

관련 정보