web-dev-qa-db-fra.com

Comment imbriquer correctement les backticks Bash

Soit j'ai raté un jeu, soit le jeu ne semble pas fonctionner avec trop de boucle de programmation.

$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"

hello1-hello2-hello3-echo hello4

Recherché

hello1-hello2-hello3-hello4-hello5-hello6-...
77
hhh

Utilisez à la place $(commands):

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4

$(commands) fait la même chose que les backticks, mais vous pouvez les imbriquer.

Vous pouvez également être intéressé par les extensions de la gamme Bash:

echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10
129
Joey Adams

si vous insistez pour utiliser des astuces, les actions suivantes pourraient être effectuées

$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"

vous devez mettre des barres obliques inverses, \\ \\\\ \\\\\\\\ par 2x et ainsi de suite, c'est juste très moche, utilisez $(commands) comme suggéré.

32
YOU

Chaque fois que vous souhaitez évaluer une commande, utilisez command substitution:

$(command)

Chaque fois que vous souhaitez évaluer une expression arithmétique, utilisez expression substitution:

$((expr))

Vous pouvez les imbriquer comme ceci:

Disons que file1.txt est de 30 lignes et file2.txt est de 10 lignes, que vous pouvez évaluer une expression comme ceci:

$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))

qui produirait 20 (la différence de nombre de lignes entre deux fichiers).

10
toobsco42

C'est beaucoup plus facile si vous utilisez $(cmd)syntaxe de substitution de commandes de bash, ce qui est beaucoup plus convivial pour être imbriqué:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
9
Mark Rushakoff

Parfois, l'imbrication de backtick peut être remplacée par xargs et des tuyaux

$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4

Les inconvénients de cette solution sont:

  • Tous les arguments doivent être fournis dans l'ordre inverse (4 → 1);
  • Tous les arguments sont séparés par des espaces (résolubles avec tr):

    $ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-'
    hello1-hello2-hello3-hello4
    

Les commandes suivantes fonctionnent dans bash, mais pas dans tcsh (l'imbrication de backtick n'est pas très bien gérée dans tcsh)

$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``

Ils peuvent être remplacés par

$ which bash | xargs dirname | xargs ls
0
G. C.