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-...
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
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é.
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).
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
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 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