variable de eco con contenido de la sustitución de comandos

Escribí un script muy básico de sustitución de comandos que se encuentra a continuación:

#!/bin/bash files=$(ls *.fastq); echo $files 

El directorio contiene un montón de archivos .fastq y solo quiero usar el comando echo para generarlos

El sript anterior genera archivos fastq con un espacio entre cada nombre de archivo fastq.

Cuando lo uso de esta manera

#!/bin/bash files=$(ls *.fastq); echo "$files" 

imprime los resultados en nuevas líneas.

¿Por qué es así? ¿Tiene algo que ver con la sustitución de comandos?

Gracias

Responder

Al hacer referencia a una variable, Por lo general, se recomienda incluir su nombre entre comillas dobles. Esto evita la reinterpretación de todos los caracteres especiales dentro de la cadena entre comillas, excepto $, ` (cita inversa) y \ (escapar). Mantener $ como un carácter especial entre comillas dobles permite hacer referencia a una variable entre comillas («$ variable»), es decir, reemplazar la variable con su valor.

Uso comillas dobles para evitar la división de palabras. Un argumento entre comillas dobles se presenta como una sola palabra, incluso si contiene separadores de espacios en blanco.

Por ejemplo,

variable1="a variable containing five words" COMMAND This is $variable1 # Executes COMMAND with 7 arguments: # "This" "is" "a" "variable" "containing" "five" "words" COMMAND "This is $variable1" # Executes COMMAND with 1 argument: # "This is a variable containing five words" 

Incluir los argumentos de una declaración de eco entre comillas dobles es necesario solo cuando la división de palabras o la conservación de espacios en blanco es un problema.

Para obtener más información y ejemplos, vaya aquí

Respuesta

Tiene nuevas líneas porque ls las coloca en líneas separadas. Las líneas nuevas desaparecen sin las comillas porque el shell (bash) pasa cada texto separado por espacios sin comillas al comando como un argumento separado.

Nota: La sustitución de comandos la realiza el shell, no ls , por lo que no necesita ls.

Por lo tanto, puede hacerlo

#!/bin/bash echo *.fastq 

o

#!/bin/bash files="*.fastq" echo "$files" 

Comentarios

  • ejecutando ls * .fastq en las salidas del terminal en la misma línea separados por espacios, ¿cómo los pone en líneas separadas entonces?
  • No puedo encontrar los documentos, pero ls saldrá igual que ls -x cuando a un tty, y me gusta ls -1 cuando no. Por lo tanto, use ls -x para obtener lo que desea.

Respuesta

Cuando se refiere a una variable sin comillas (por ejemplo, echo $files), el shell divide el valor en espacios en blanco y pasa cada término como una opción de línea de comandos separada. Las líneas nuevas se tratan de la misma forma que cualquier otro espacio en blanco. El programa echo no ve los caracteres de nueva línea en absoluto; solo obtiene una matriz de cadenas, cada una de las cuales es un nombre de archivo único.

Cuando se refiere a una variable entre comillas (por ejemplo, echo "$files"), el shell no hace ninguna división de espacios en blanco; en su lugar, pasa el valor completo, sin modificar, como un argumento único . El programa echo recibe una cadena larga que incluye los caracteres de nueva línea.

Dejando a un lado las variables, este es el mismo comportamiento que se obtiene con comillas alrededor de valores literales. Si escribe echo foo bar, el shell elimina los espacios y echo solo obtiene las cadenas foo y bar, e «imprimirá esas cadenas con un solo espacio entre ellas, ya que así es como está» codificado para combinar varios argumentos. Si escribe echo "foo bar", echo obtiene la cadena única foo bar y la imprime como está.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *