Como criar dinamicamente o código Bash com um loop e executá-lo à medida que é criado

1

Eu tenho uma lista de linhas em um script Bash da seguinte forma

if [ ! -z "$clone01" ]; then git clone "$clone01"; fi
if [ ! -z "$clone02" ]; then git clone "$clone02"; fi
if [ ! -z "$clone03" ]; then git clone "$clone03"; fi
#      $clone01 .... through to ...  $clone60
if [ ! -z "$clone60" ]; then git clone "$clone60"; fi

o zero inicial no final da variável, quando o número for menor que 10, é importante.

Eu tentei várias substituições e loops etc. Esse código é muito repetitivo e existem 60 linhas dele.

Como posso criar esse código dinamicamente e torná-lo parte do meu script executado? Qual é a abordagem ideal para este problema?

    
por Kes 08.12.2017 / 14:51

3 respostas

5

Ok, não faça isso, é feio. Coloque os URLs em um array e faça um loop sobre ele:

urls=( http://this.git http://that.git )
for url in "${urls[@]}" ; do
    git clone "$url"
done

ou coloque-os em um arquivo, um por linha, e faça um loop lendo as linhas. Aqui, pode ser útil proteger as linhas vazias, assim como você fez. Poderíamos também ignorar as linhas que começam com # como comentários:

while read -r url ; do
    if [ -z "$url" ] || [ "${url:0:1}" = "#" ]; then continue; fi
    git clone "$url"
done < file.with.urls

Se você quiser o contador de linha também, é fácil adicionar com expansões aritméticas .

    
por 08.12.2017 / 15:39
3

Não use eval para fazer isso. Uma ferramenta muito melhor é a indireta de variáveis :

for i in clone{01..60}; do 
   [[ ${!i} ]] && git clone "${!i}"
done

[[ $var ]] faz o mesmo que [ ! -z "$var" ] . Note que armazenar 60 valores em 60 variáveis não é a melhor abordagem e você pode querer usar arrays para fazer isso.

    
por 08.12.2017 / 15:51
1

Já tentou envolver o seu if num loop for como este?

for i in clone{01..60}; do echo $i; done

Isso resulta na seguinte saída:

clone01
clone02
clone03
... clipped for length ...
clone60

Então, algo assim parece que vai fazer o truque:

for i in clone{01..60}; do if [ ! -z $i ]; then git clone $i; fi; done

Recursos úteis para isso:

link

link

    
por 08.12.2017 / 15:21