Cómo correctamente nido acentos abiertos Bash
Pregunta
Ya sea que se perdió un poco de contragolpe o backlashing no parece trabajo con demasiada programador Cotización en bucle.
$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"
hello1-hello2-hello3-echo hello4
Se busca
hello1-hello2-hello3-hello4-hello5-hello6-...
Solución
Uso $(commands)
lugar:
$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
$(commands)
hace lo mismo como acentos abiertos, pero puede anidar ellos.
Es posible que también esté interesado en expansiones Bash:
echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10
Otros consejos
Si usted insiste para uso acentos abiertos, lo siguiente podría hacerse
$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"
usted tiene que poner las barras invertidas, \\ \\\\ \\\\\\\\
por 2x y así sucesivamente, es sólo muy feo, $(commands)
uso como otra propuesta.
En cualquier momento en que desea evaluar un command substitution
uso de comandos:
$(command)
En cualquier momento en que desea evaluar una expresión expression substitution
aritmética uso:
$((expr))
Puede anidar éstos como esto:
file1.txt digamos Vamos es de 30 líneas de largo y file2.txt es de 10 líneas de largo, que se puede evaluar una expresión como la siguiente:
$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))
lo que la salida 20 (la diferencia en el número de líneas entre dos archivos).
Es mucho más fácil si utiliza $(cmd)
comando de fiesta de la sustitución de sintaxis , que es mucho más amigable para ser anidados:
$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
A veces backtick anidamiento pueden estar sustituidos con xargs
y tuberías
$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4
inconveniente de esta solución son:
- Todos los argumentos se debe proporcionar en orden inverso (4 ? 1);
-
Todos los argumentos se convierten en el espacio separado (solucionable con
tr
):$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-' hello1-hello2-hello3-hello4
Vamos a mostrar un verdadero caso de uso.
A raíz de comandos funcionan en bash, pero no en tsch (anidación backtick no se maneja muy bien en tcsh)
$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``
Se puede estar sustituido con
$ which bash | xargs dirname | xargs ls