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'"
^ ^
割り当てはOPT
文字列に設定されます-aPh -e ssh --rsync-path='sudo rsync'
。コマンドラインで展開されると、スペースで、およびrsync
5つの異なる引数に分割されます。aPh
-e
ssh
--rsync-path='sudo
rsync'
'\''
出力に表示されるのは、bash -x
引用符を含むパラメータを表します。読み取りは少し難しいですが、'foo'\''bar'
一重引用符と同じです"foo'bar"
(中間にエスケープされた一重引用符付きの二重引用符文字列があります)。
変数拡張後、引用符は機能しません。単純変数にスペースを含む引数を含むコマンドを保存することはできません。代わりに配列を使用する必要があります。
望むより: