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-...
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top