Reemplazar backtick con $ () no funciona


17

Tengo algunos scripts antiguos que intento actualizar. Parte del código se condensa a:

 export X=`(echo "abc"; echo "def")`
 echo $X

que da el resultado esperado:

 abc def

Ahora, Internet me dice que los backticks están fuera $()es lo que necesito usar, pero cuando lo intento:

export X=$((echo "abc"; echo "def"))

X no está configurado y me sale el error:

bash: echo "abc"; echo "def": syntax error: invalid arithmetic operator (error token is ""abc"; echo "def"")

¿Qué estoy haciendo mal?

Respuestas:


27

La $(( … ))sintaxis es una expresión aritmética .

Lo que falta es un espacio entre el $(y el siguiente (, para evitar la sintaxis de la expresión aritmética.

La sección sobre sustitución de comandos en la especificación del lenguaje de comandos de shell en realidad advierte que:

If the command substitution consists of a single subshell, such as:

   $( (command) )

a conforming application shall separate the "`$(`" and '`(`' into two tokens
(that is, separate them with white space). This is required to avoid any
ambiguities with arithmetic expansion.

21
Debe tenerse en cuenta que `...`e $(...)iniciar una subshell de todos modos, por lo que (...)no son necesarios los internos (desperdiciar un proceso) Necesitaría el espacio en cosas como, $( (...); (...) )por ejemplo (donde las subcapas internas pueden ser necesarias).
Stéphane Chazelas

15

Tratar export X="$(echo "abc"; echo "def")"


Gracias, esto funciona, pero requiere más edición que la otra solución.
Harold

2
+1 para incluir las comillas necesarias en la mayoría de los shells POSIX ( kshy bashser las únicas excepciones).
Stéphane Chazelas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.