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
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á.
ls
saldrá igual quels -x
cuando a un tty, y me gustals -1
cuando no. Por lo tanto, usels -x
para obtener lo que desea.