Когда пользователь вводит 3 имени папки, я хочу, чтобы все разные имена были помещены один раз на место $ col в этом
rsync -RravhP $ Code --exclude "pub / $ col" --exclude "$ col" --exclude "$ col" $ destination;
#!/bin/bash
echo " enter source folder name" ;
read Code ;
echo " enter destination folder name"
read destination ;
if [ $Code ] ;
then
echo " enter folders to exclude seperated by a space"
read folders ;
colors="$folders"
for col in "$colors"
do
rsync -RravhP $Code --exclude "pub/$col" --exclude "$col" --exclude "$col" $destination ;
done
else
echo " something went wrong, please check foldername "
fi
В следующем тексте вам нужно убрать двойные кавычки:
for col in "$colors"
В противном случае все разделенные пробелами $colors
будут отображаться как один в $col
.
Обратите внимание, что у вас также есть colors="$folders"
, которые также могут вызывать проблемы. Вы можете протестировать с помощью:
for col in $folders
Также. Вы также можете напрямую прочитать данные в $colors
.
В качестве быстрого теста вы можете сделать это:
for n in "1 2 3"
do
echo $n
done
Результатом будет:
1 2 3
в одной строке.
То, что вы пытаетесь сделать, это:
for n in 1 2 3
do
echo $n
done
В этом втором случае вы получаете:
1
2
3
Кавычки могут быть использованы внутри цикла, что вы уже делаете, если в одной из ваших папок есть пробелы. Но всегда довольно сложно правильно обрабатывать пробелы в именах файлов в сценарии оболочки. Лучший способ убедиться, что все работает правильно, — запустить тесты с такими папками.
Я предполагаю, что вы хотите сгенерировать флаг --exclude
для каждого имени, введенного пользователем, т.е. если пользователь вводит foo bar
, вы хотите, чтобы командная строка имела что-то вроде этого?
rsync ... --exclude foo --exclude bar ...
Поскольку вы пометили это с помощью bash, вы можете использовать read -a
для чтения слов, заданных пользователем, прямо в массив, а затем построить другой массив, содержащий необходимые параметры для rsync
:
read -a dirs
excludes=()
for d in "${dirs[@]}" ; do
excludes+=(--exclude "$d")
done
rsync -RravhP "$Code" "${excludes[@]}" "$destination"
Без -r
до read
вы все равно можете экранировать имена пробелами, введя что-то вроде aa bb\ cc
, чтобы получить два имени aa
и bb cc
.
Это сработало для меня:
**#!/bin/bash
echo " enter source folder name" ;
read Code ;
echo " enter destination folder name"
read destination ;
echo " input folders to exclude" ;
read folders ;
input="$folders"
echo the folders entered are $input
for cols in $input ;
do
echo $cols >> log.txt
rsync -RravhP --exclude-from log.txt $Code $destination
log.txt**