Question

Soit je manqué un certain jeu ou ne semble pas un contrecoup au travail avec trop-devis en boucle programmeur.

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

hello1-hello2-hello3-echo hello4

Voulu

hello1-hello2-hello3-hello4-hello5-hello6-...
Était-ce utile?

La solution

Utilisez $(commands) au lieu:

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

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

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

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

Autres conseils

si vous insistez à utiliser des accents graves, suivant pourrait être fait

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

vous devez mettre des antislashes, \\ \\\\ \\\\\\\\ par 2x et ainsi de suite, son juste très laid, l'utilisation $(commands) comme autre suggéré.

Chaque fois que vous voulez évaluer une commande utilisation command substitution:

$(command)

Chaque fois que vous voulez évaluer une utilisation d'expression arithmétique expression substitution:

$((expr))

Vous pouvez imbriquer ces comme ceci:

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

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

qui serait sortie 20 (la différence dans le nombre de lignes entre deux fichiers).

Il est beaucoup plus facile si vous utilisez la syntaxe de substitution de bash $(cmd) la commande , qui est beaucoup plus facile d'être imbriqués:

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

Parfois, l'imbrication backtick peut être substitué par xargs et tuyaux

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

Inconvénient de cette solution sont:

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

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


Montrons un vrai cas d'utilisation.

Les commandes suivantes fonctionnent dans bash, mais pas dans tcsh (nidification backtick ne sont pas traitées très bon dans tcsh)

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

Ils peuvent être substitués avec

$ which bash | xargs dirname | xargs ls
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top