Comment correctement nid Bash contre-apostrophes
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-...
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