Come correttamente nido Bash apici inversi
Domanda
In entrambi mi mancava qualche contraccolpo o backlashing non sembra funzionare con troppa programmatore-quote-loop.
$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"
hello1-hello2-hello3-echo hello4
Cercasi
hello1-hello2-hello3-hello4-hello5-hello6-...
Soluzione
Usa $(commands)
invece:
$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
$(commands)
fa la stessa cosa come apici inversi, ma è possibile nidificare loro.
Si può anche essere interessati a Gamma Bash espansioni:
echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10
Altri suggerimenti
se insistete ad uso backticks, in seguito potrebbe essere fatto
$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"
si deve mettere backslash, \\ \\\\ \\\\\\\\
di 2x e così via, il suo solo molto brutto, l'uso $(commands)
come altri suggerito.
Ogni volta che si desidera valutare un command substitution
uso dei comandi:
$(command)
Ogni volta che si desidera valutare un aritmetica uso un'espressione expression substitution
:
$((expr))
È possibile nidificare questi in questo modo:
diciamo file1.txt Let è lungo 30 righe e file2.txt è lungo 10 righe, che si può valutare un'espressione così:
$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))
che sarebbe uscita 20 (la differenza nel numero di linee tra due file).
E 'molto più facile se si utilizza $(cmd)
sostituzione di comando sintassi di bash, che è molto più amichevole per essere nidificati:
$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
A volte backtick nidificazione può essere sostituito con xargs
e tubi
$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4
inconveniente di questa soluzione sono:
- Tutti gli argomenti devono essere fornite in ordine inverso (4 → 1);
-
Tutti gli argomenti diventano separati da uno spazio (risolvibili con
tr
):$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-' hello1-hello2-hello3-hello4
Mostriamo un vero e proprio caso d'uso.
comandi seguenti lavori in bash, ma non in tcsh (backtick nidificazione non è gestita molto bene in tcsh)
$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``
Si può essere sostituito con
$ which bash | xargs dirname | xargs ls