Bash:生成された配列を引数リストとして実行しますか?

Bash:生成された配列を引数リストとして実行しますか?

borgbackupを使用するとこの問題が発生しましたが、応答は同じであるため、rsync例ではこれを使用します。

各パラメータにプレフィックスを追加してパラメータ配列を作成し、その配列をに割り当てたいが存在しないかのように動作しますrsyncrsync

次のスクリプトを使用してください。

#!/usr/bin/env bash
#

declare -a exclude_String
for excludestr in $(cat ./list); do
    exclude_String+=(--exclude=$excludestr)
done
rsync "${exclude_String[@]}" . $Destination

そして./list

'/home/*'
'*.vim*'

実行中のプロセスのうち、Aはpsパラメータを正しく表示します。

/usr/bin/rsync --exclude='*.vim*' --exclude='/home/*' . DESTINATION

しかし、rsyncまだその人々がそこにいないかのように振る舞います。私が見つけたこの問題トピックに関して以下を試してください。

#!/usr/bin/env bash
#

declare -a exclude_String
exclude_String+=(--exclude='/home/*')
exclude_String+=(--exclude='*.vim*')

rsync "${exclude_String[@]}" . $Destination

これは実際に動作します。

私はまだシェル拡張やその他などについてあまり知りません。何かが見つかるかどうかを確認するために、あちこちに引用符と二重引用符を使用してみましたが、運がありませんでした。

これを達成する方法についてのアイデアはありますか?

ベストアンサー1

ファイルに実際に、'/home/*'および引用符が含まれている場合、引用符はexcludestrループの値に表示され、ユーザーが指定した引数に表示されますrsync。この場合、これはシェルコマンドの一部ではなく、コマンド置換の拡張値の一部にすぎません。

一方、exclude_String+=(--exclude='/home/*')今、引用符で囲みます。はいシェルコマンドの一部であり、コマンド処理中に削除されます。 (*一般キャラクターを作る効果があります。)

rsync実際には、除外パターンの一部として引用符を期待したり処理したりするのではなく、単にそれを別の文字として扱い、名前に引用符を含むファイルを除外します。したがって、一部のファイルのデータに除外パターンがある場合は、引用符を含めないでください。

for x in $(cat file)また、代わりにを使用するか、while IFS= read -r line; do ...; done < fileこの場合はを使用してくださいmapfile -t exclude_String < file。このコマンド置換はcat単語区切りを呼び出すため、スペースを含む除外パターンは使用できません。また、繰り返しの単語リストからパターンのglobbingをすぐに呼び出しますfor。あなたが望むものではありませんか?


一般的に言えば、必要なものは次のとおりです。

excludes=()
while IFS= read -r line; do 
    excludes+=(--exclude="$line")
done < ./list 
rsync "$flags" "${excludes[@]}" . "$destination"

./list除外するパターンのみを含める:

/home/*
*.vim*

"$line"(内側の引用符は、+=(--exclude="$line")シェルが--exclude=something現在のディレクトリから呼び出されたファイルをグローブするのを防ぎます。)

この場合、以下をrsync使用することもできます--exclude-from

rsync "$flags" --exclude-from=./list . "$destination"

ループを提供するためにファイルよりも複雑なものを使用したい場合は、プロセス置換を使用できます。

while IFS= read -r line; do
    excludes+=(--exclude="$line")
done < <(some command that produces the exclude patterns)

また見なさい:私の変数が1つの「読み込み中」ループではローカルですが、一見似ている他のループではローカルではないのはなぜですか?

おすすめ記事