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'"
                              ^          ^

割り当てはOPT文字列に設定されます-aPh -e ssh --rsync-path='sudo rsync'。コマンドラインで展開されると、スペースで、およびrsync5つの異なる引数に分割されます。aPh-essh --rsync-path='sudorsync'

'\''出力に表示されるのは、bash -x引用符を含むパラメータを表します。読み取りは少し難しいですが、'foo'\''bar'一重引用符と同じです"foo'bar"(中間にエスケープされた一重引用符付きの二重引用符文字列があります)。

変数拡張後、引用符は機能しません。単純変数にスペースを含む引数を含むコマンドを保存することはできません。代わりに配列を使用する必要があります。

望むより:

関連情報