Цикл For в сценарии bash, установка другого значения в команду

Когда пользователь вводит 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
0
04.06.2017, 23:21
3 ответа

В следующем тексте вам нужно убрать двойные кавычки:

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

Кавычки могут быть использованы внутри цикла, что вы уже делаете, если в одной из ваших папок есть пробелы. Но всегда довольно сложно правильно обрабатывать пробелы в именах файлов в сценарии оболочки. Лучший способ убедиться, что все работает правильно, — запустить тесты с такими папками.

0
28.01.2020, 02:33

Я предполагаю, что вы хотите сгенерировать флаг --exclude для каждого имени, введенного пользователем, т.е. если пользователь вводит foo bar, вы хотите, чтобы командная строка имела что-то вроде этого?

rsync ... --exclude foo --exclude bar ...

Поскольку вы пометили это с помощью , вы можете использовать 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.

2
28.01.2020, 02:33

Это сработало для меня:

**#!/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**
0
28.01.2020, 02:33

Теги

Похожие вопросы