echo variable com conteúdo da substituição de comando

3

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

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

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

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

Quando eu uso desta maneira

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

imprime os resultados em novas linhas.

Por que isso acontece? É algo a ver com a substituição de comandos?

Obrigado

    
por user3138373 27.08.2015 / 23:52

3 respostas

2

Ao referenciar uma variável, geralmente é aconselhável colocar seu nome entre aspas duplas. Isso impede a reinterpretação de todos os caracteres especiais na string citada - exceto $ , ' (backquote) e \ (escape). Manter $ como um caractere especial entre aspas duplas permite fazer referência a uma variável entre aspas ("variável $"), ou seja, substituir a variável pelo seu valor.

Use aspas duplas para impedir a divisão de palavras. Um argumento entre aspas duplas apresenta-se como uma única palavra, mesmo que contenha separadores de espaços 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"

Colocar 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 é um problema.

Para mais informações e exemplos, acesse aqui

    
por 28.08.2015 / 00:04
4

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 sem espaço no campo para o comando como um argumento separado.

Nota: A substituição de comandos é feita pelo shell, não por ls , portanto, você não precisa de ls .

Portanto, você pode fazer

#!/bin/bash
echo *.fastq

ou

#!/bin/bash
files="*.fastq"
echo "$files"
    
por 27.08.2015 / 23:58
1

Quando você se refere a uma variável sem aspas (por exemplo, echo $files ), o shell divide o valor separadamente no espaço 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 programa echo não vê os caracteres de nova linha; ele apenas recebe uma matriz de strings, cada uma delas é um único nome de arquivo.

Quando você se refere a 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 transmite o valor inteiro, não modificado, como um argumento único . O programa echo recebe uma longa sequência que inclui os caracteres da nova linha.

Variáveis à parte, este é 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 removidos pelo shell e echo apenas obterá as strings foo e bar , e imprimirá essas strings com um único espaço entre elas, já que é assim que é codificado para combinar vários argumentos. Se você escrever echo "foo bar" , echo obterá a única string foo bar e a imprimirá como está.

    
por 28.08.2015 / 00:13