私はこのようなバックアップ用のスクリプトを書いています:私はそれがすべてのファイルまたは唯一のデルタをタールように、tarコマンドに単一の変数$delta_cmd
を渡したい可変数のパラメータをシェルコマンドに渡すには?
dir="$1"
mode="$2"
delta="$3"
for file in "$dir/backup."*".$mode.tar.gz"; do
[ "$file" -nt "$ref" ] && ref="$file"
done
if [ "$delta" = "true" ]; then
delta_cmd=-N "'$ref'"
fi
backup_file="$dir/backup.$(date +%Y%m%d-%H%M%S).$mode.tar.gz"
case "$mode" in
config)
tar -cpzvf "$backup_file" $delta_cmd \
/etc \
/usr/local
;;
# still other modes here...
esac
:
backup.sh最後のバックアップ以降のファイルは、$delta
の値によって異なります。
上記のコードは、エラーメッセージを作成し、$delta
がtrueに設定されている場合、デルタファイルを正しくタールしません。それを修正するには?
P.S:スクリプトはPOSIX互換の方がよいでしょう。あなたは、部分的/完全なコマンドラインを格納するためBASHアレイを使用する必要があります
それはです* POSIX互換にすることは可能ですが、セキュリティ上の脆弱性( 'eval'を使う)や' $ @ '(' delta_cmd'文字列の使用とはかなり互換性がありません)カプセル化することを意味するその配列のスクリプトグローバル値をオーバーライドしたくない場合は、関数内でコード化します。文字列変数(配列とは対照的に)が引数リストやコマンドを格納するために安全に使用できない理由については、BashFAQ#50を参照してください。http://mywiki.wooledge.org/BashFAQ/050 –
'$ @'を上書きする方法についてもっと詳しく? –
回答を追加しました。ところで、このコードには、適切なMCVE(**最小**、完全で検証可能な例; http://stackoverflow.com/help/mcveを参照)を作成するために削減できる余裕があります。私の答えに内容を含めることを非常に躊躇しています。これには 'ls 'の構文解析などの悪い習慣が含まれていますが、そのコードのより良い慣行の置き換えもやっています。 –