#!/bin/bash
exclude='Archive PST,SystemState'
IFS=$","
rsyncExclusions=$(for exclude in ${exclude}; do echo -n -e --exclude=\"${exclude}\"\ ; done)
unset IFS
echo rsync $rsyncExclusions test
rsync -avh --delete --delete-excluded "$rsyncExclusions" /tmp/test1 /tmp/test2
When the script runs it fails to exclude the exclusions from $exclude. the output from bash shows that when it echoes the exclusions into the rsync line they appear to have single quotes around them which ruins rsync's interpretation of the excludes.
The echo of the variable appears fine.
$ bash -x /tmp/exclude
+ exclude='Archive PST,SystemState'
+ IFS=,
++ for exclude in '${exclude}'
++ echo -n -e '--exclude="Archive PST" '
++ for exclude in '${exclude}'
++ echo -n -e '--exclude="SystemState" '
+ rsyncExclusions='--exclude="Archive PST" --exclude="SystemState" '
+ unset IFS
+ echo rsync '--exclude="Archive' 'PST"' '--exclude="SystemState"' test
rsync --exclude="Archive PST" --exclude="SystemState" test
+ rsync -avh --delete --delete-excluded '--exclude="Archive PST" --exclude="SystemState" ' /tmp/test1 /tmp/test2
sending incremental file list
test1/
test1/Archive PST/
test1/SystemState/
sent 98 bytes received 24 bytes 244.00 bytes/sec
total size is 0 speedup is 0.00
How can I get the output of the exclusions to appear exactly how echoing the variable looks?
The read solution will not work in bash, since the part after the pipe runs in a subshell and thus the variables lose their values.
Your original idea would work, with a different variable name and a correct way of setting/unsetting IFS like methyl suggested.
You can do something like this:
rsyncExclusions=$(IFS=,;for excl in ${exclude}; do printf "%s" "--exclude=\"$excl\" "; done)
then you temporarily change IFS and you do not have to set IFS to its original value.