Boucles de langage naturel dans la coquille [fermé]

0

Existe-t-il un moyen naturel d'exécuter une commande dans une boucle sur un ensemble d'entrées sans utiliser explicitement une construction de boucle? Je veux dire d'une manière qui ressemble à la façon dont nous parlons en anglais.

Par exemple,

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

au lieu de

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

Pouvez-vous faire ça bash? Y at-il un autre shell qui a une fonctionnalité comme celle-ci?

Il n'est pas nécessaire que ce soit la syntaxe exacte que j'ai indiquée ici, mais quelque chose d'idiomatique qui n'est pas aussi volumineux que la boucle imbriquée.

saintali
la source
Cela va être entièrement à la commande et / ou au shell. Y a-t-il un problème que vous essayez réellement de résoudre ou êtes-vous en train de théoriser sur quelque chose que vous auriez souhaité être le cas?
music2myear
Je connais. Je traite avec une commande qui n'a pas cette fonctionnalité, donc je cherche quelque chose dans la coquille.
saintali
Mon exemple estkubectl --context=context1,context2 --namespace=ns1,ns2 get pod
saintali
La philosophie de * nix est très lourde en personnalisation, telle que l'écriture de vos propres scripts et commandes. Donc, vous / on pourrait peut-être écrire votre / votre propre?
barlop
en plus des coquillages, vous pourriez aussi envisager des langages de script. Rebol est peut-être un langage de script qui se veut naturel. Mais peut-être que parfois, essayer de rendre une langue plus naturelle peut parfois rendre difficile la compréhension de la syntaxe, car aucune langue ne vous pardonne si vous faites une erreur syntaxique mineure, elle n’est donc jamais naturelle.
barlop

Réponses:

1

Vous pouvez cacher la forboucle dans une fonction shell. Voici une implémentation plutôt fragile basée sur l'exemple de votre question:

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

Ensuite, la fonction serait appelée comme loop some-command -a john,jane -b doe,roe. Par exemple:

$ 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
$ _
dsstorefile1
la source
Eh bien, je pense que c'est un pas dans la bonne direction. mais vous supposez qu'il y aura toujours 2 niveaux d'imbriqués for. il n'y a aucun moyen de rendre cette dynamique?
saintali
merci pour l'exemple d'expansion d'accolade. ça m'a donné une idée!
saintali
0

Je cherche toujours une meilleure réponse, mais voici une "solution" provisoire.

Après avoir appris l’expansion du corset dans bash, c’est ce que j’ai trouvé. Malheureusement, vous devez échapper à tous les caractères spéciaux de la commande ou utiliser des guillemets:

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

Par exemple,

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

Encore un peu gênant. Pas sûr si d'autres coquilles ont une meilleure option.

saintali
la source