Loops de linguagem natural no shell [closed]

0

Existe uma maneira natural de executar um comando em um loop em um conjunto de entradas sem usar explicitamente uma construção de loop? Quero dizer, de uma forma que se assemelha a como falamos em inglês.

Por exemplo,

some-command -a john,jane -b doe,roe

em vez de

for a in john jane; do
   for b in doe roe; do
     some-command -a $a -b $b
   done
done

Você pode fazer isso em bash ? Existe outro shell que tenha um recurso como esse?

Não precisa ser exatamente a mesma sintaxe que coloquei aqui, mas algo idiomático que não é tão volumoso quanto o loop aninhado.

    
por saintali 10.05.2018 / 00:46

2 respostas

1

Você pode ocultar o loop for em uma função do shell. Aqui está uma implementação bastante frágil com base no exemplo da sua pergunta:

loop ()
{
    for i in 'echo $3 |tr ',' ' '';
    do
        for j in 'echo $5 |tr ',' ' '';
        do
            $1 $2 $i $4 $j;
        done;
    done;
}

Em seguida, a função seria chamada como loop some-command -a john,jane -b doe,roe . Por exemplo:

$ for i in /{bin,media}; do for j in /{srv,tmp/tmp}; do \ls -d $i $j; done; done
/bin  /srv
/bin  /tmp/tmp
/media  /srv
/media  /tmp/tmp
$ loop ls -d /bin,/media "" /srv,/tmp/tmp
/bin  /srv
/bin  /tmp/tmp
/media  /srv
/media  /tmp/tmp
$ _
    
por 10.05.2018 / 01:39
0

Ainda estou procurando uma resposta melhor, mas aqui está uma "solução" provisória.

Depois de aprender sobre a expansão de chaves no bash, foi isso que eu criei. Infelizmente você tem que escapar todos os caracteres especiais no comando ou usar aspas:

eval 'some-command -a '{john,jane}' -b '{doe,roe}';'
eval some-command\ -a\ {john,jane}\ -b\ {doe,roe}\;

Por exemplo,

eval 'kubectl --context='{context1,context2}' --namespace='{ns1,ns2}' get pod;'
eval kubectl\ --context={context1,context2}\ --namespace={ns1,ns2}\ get\ pod\;

Ainda um pouco estranho. Não tenho certeza se outras conchas têm uma opção melhor.

    
por 11.05.2018 / 04:50

Tags