bash 스크립트 작은따옴표 및 백슬래시 생성

bash 스크립트 작은따옴표 및 백슬래시 생성

rsync를 사용하여 서버에 스냅샷을 백업하기 위한 bash 스크립트를 작성하려고 합니다.

내가 부르고 싶은 명령은

rsync -aPh -e ssh --rsync-path='sudo rsync' --link-dest=../last /home/username/files remoteuser@server:/srv/backups/snapshots/username/snapshot_xxx

내 스크립트는 다음과 같습니다

OPT="-aPh -e ssh --rsync-path='sudo rsync'"
LINK="--link-dest=../last/" 
SRC="/home/username/files/"
SNAP="remoteuser@server:/srv/backups/snapshots/username/"
date=`date "+%Y-%b-%d_%T"`

# Run rsync to create snapshot
rsync $OPT $LINK $SRC ${SNAP}$date

bash -x를 사용하여 이 스크립트를 실행하면 내가 받는 명령은 다음과 같습니다.

rsync -aPh -e ssh '--rsync-path='\''sudo' 'rsync'\''' --link-dest=../last /home/username/files remoteuser@server:/srv/backups/snapshots/username/snapshot_xxx

이로 인해 다음 오류가 발생합니다.

bash: -c: line 0: 일치하는 '''을(를) 찾는 동안 예상치 못한 EOF가 발생했습니다.

bash: -c: 행 1: 구문 오류: 예기치 않은 파일 끝

bash가 추가 작은따옴표와 이스케이프된 작은따옴표를 삽입하는 것을 방지하는 방법은 무엇입니까?

답변1

Bash는 추가 따옴표를 삽입하지 않지만 여기에서 수행합니다.

OPT="-aPh -e ssh --rsync-path='sudo rsync'"
                              ^          ^

할당은 OPTstring 으로 설정됩니다 -aPh -e ssh --rsync-path='sudo rsync'. 명령줄에서 확장되면 공백에서 , 및 rsync5개의 서로 다른 인수로 분할됩니다.aPh-essh --rsync-path='sudorsync'

'\''출력에 표시되는 것은 bash -x따옴표가 포함된 매개변수를 나타냅니다. 읽기가 약간 어렵지만 'foo'\''bar'작은따옴표와 같습니다 "foo'bar"(중간에 이스케이프된 작은따옴표가 있는 두 개의 작은따옴표 문자열이 있습니다).

변수 확장 후에는 따옴표가 작동하지 않습니다. 단순 변수에 공백이 포함된 인수가 포함된 명령을 저장할 수 없으며 대신 배열을 사용해야 합니다.

바라보다:

관련 정보