variável echo com conteúdo de substituição de comando

Eu escrevi um script muito básico de substituição de comando que está abaixo:

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

O diretório contém muitos arquivos .fastq e eu só quero usar o comando echo para gerá-los

O sript acima produz arquivos fastq com um espaço entre cada nome de arquivo fastq.

Quando eu o uso dessa forma

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

ele imprime os resultados em novas linhas.

Por que isso acontece? Tem a ver com substituição de comando?

Obrigado

Resposta

Ao fazer referência a uma variável, geralmente é aconselhável colocar seu nome entre aspas duplas. Isso evita a reinterpretação de todos os caracteres especiais dentro da string entre aspas – exceto $, ` (backquote) e \ (escape). Manter $ como um caractere especial entre aspas duplas permite referenciar uma variável entre aspas (“$ variable”), ou seja, substituir a variável por seu valor.

Use aspas duplas para evitar divisão de palavras. Um argumento entre aspas duplas se apresenta como uma única palavra, mesmo se contiver separadores de espaço em branco.

Por exemplo,

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 os argumentos em uma instrução echo entre aspas duplas é necessário apenas quando a divisão de palavras ou a preservação de espaços em branco for um problema.

Para obter mais informações e exemplos, vá aqui

Resposta

Você tem novas linhas porque ls as coloca em linhas separadas. As novas linhas desaparecem sem as aspas porque o shell (bash) passa cada texto separado por espaços não citados para o comando como um argumento separado.

Observação: a substituição do comando é feita pelo shell, não por ls , então você não precisa de ls.

Portanto, você pode fazer

#!/bin/bash echo *.fastq 

ou

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

Comentários

  • executando ls * .fastq nas saídas do terminal na mesma linha separada por espaços, como ls os está colocando em linhas separadas então?
  • Não consigo encontrar os documentos, mas ls terá a mesma saída que ls -x quando para um tty e como ls -1 quando não. Portanto, use ls -x para obter o que deseja.

Resposta

Quando você se refere a uma variável sem aspas (por exemplo, echo $files), o shell divide o valor em espaços em branco e passa cada termo como uma opção de linha de comando separada. As novas linhas são tratadas da mesma forma que qualquer outro espaço em branco. O echo programa não vê os caracteres de nova linha; ele apenas obtém uma matriz de strings, cada uma sendo um único nome de arquivo.

Quando você se refere para uma variável entre aspas (por exemplo, echo "$files"), o shell não faz nenhuma divisão de espaço em branco; em vez disso, ele passa o valor inteiro, sem modificações, como um argumento único . O programa echo recebe uma longa string que inclui os caracteres de nova linha.

Variáveis à parte, esse é o mesmo comportamento que você obtém com aspas em torno dos valores literais. Se você escrever echo foo bar, os espaços serão eliminados pelo shell e echo apenas obterá as strings foo e bar, e imprimirá essas strings com um único espaço entre elas, pois é assim que é codificado para combinar vários argumentos. Se você escrever echo "foo bar", echo obtém a única string foo bar e a imprime como está.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *