Para loop no bash scripting, colocando valor diferente em um comando

0

Quando um usuário digita 3 nomes de pastas, eu quero que todos os nomes diferentes sejam colocados uma vez no lugar de $ col neste

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
    
por Prateeric Kaien 04.06.2017 / 21:10

3 respostas

2

Suponho que você também queira gerar o sinalizador --exclude para cada nome inserido pelo usuário, ou seja, se um usuário inserir foo bar , você deseja que a linha de comando tenha algo assim?

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

Desde que você marcou isso com , você pode usar read -a para ler as palavras dadas pelo usuário diretamente para um < href="http://www.gnu.org/s/bash/manual/html_node/Arrays.html"> matriz e, em seguida, criar outra matriz para conter os parâmetros necessários para rsync :

read -a dirs
excludes=()
for d in "${dirs[@]}" ; do
    excludes+=(--exclude "$d")
done
rsync -RravhP "$Code" "${excludes[@]}" "$destination"

Sem -r to read você ainda pode escapar de nomes com espaços, digitando algo como aa bb\ cc para obter os dois nomes aa e bb cc .

    
por 04.06.2017 / 22:40
0

A seguir, você precisa soltar as aspas duplas:

for col in "$colors"

Caso contrário, todos os espaços separados por $colors serão mostrados como um em $col .

Note que você também tem colors="$folders" , o que também pode causar um problema. Você pode querer testar com:

for col in $folders

também. Você também pode ler diretamente os dados em $colors .

Como teste rápido, você pode fazer isso:

for n in "1 2 3"
do
    echo $n
done

O resultado será:

1 2 3

em uma linha.

O que você está tentando fazer é:

for n in 1 2 3
do
   echo $n
done

Neste segundo caso você recebe:

1
2
3

As citações podem ser usadas dentro do loop, o que você já faz, se uma de suas pastas tiver espaços. Mas é sempre bastante complicado manipular corretamente espaços em nomes de arquivos em um script de shell. A melhor maneira de garantir o funcionamento correto é executar testes com essas pastas.

    
por 04.06.2017 / 21:42
0

Isso funcionou para mim:

**#!/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**
    
por 06.06.2017 / 23:29