variabile echo con contenuto dalla sostituzione del comando

Ho scritto uno script molto semplice per la sostituzione del comando che è di seguito:

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

La directory contiene un mucchio di file .fastq e voglio solo usare il comando echo per visualizzarli

Lo sript sopra produce file fastq con uno spazio tra ogni nome di file fastq.

Quando lo uso in questo modo

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

stampa i risultati su nuove righe.

Perché è così? Ha qualcosa a che fare con la sostituzione del comando?

Grazie

Risposta

Quando si fa riferimento a una variabile, è generalmente consigliabile racchiudere il suo nome tra virgolette doppie. Ciò impedisce la reinterpretazione di tutti i caratteri speciali allinterno della stringa tra virgolette, tranne $, ` (backquote) e \ (escape). Mantenere $ come un carattere speciale tra virgolette doppie consente di fare riferimento a una variabile tra virgolette (“$ variable”), ovvero sostituire la variabile con il suo valore.

Usa virgolette doppie per evitare la suddivisione delle parole. Un argomento racchiuso tra virgolette doppie si presenta come una singola parola, anche se contiene separatori di spazi.

ad es.

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" 

Racchiudere gli argomenti in unistruzione echo tra virgolette doppie è necessario solo quando la suddivisione delle parole o la conservazione degli spazi è un problema.

Per ulteriori informazioni ed esempi, andare qui

Risposta

Hai nuove righe perché ls le inserisce su righe separate. Le nuove righe scompaiono senza le virgolette perché la shell (bash) passa ogni testo separato da spazi non quotato al comando come argomento separato.

Nota: la sostituzione del comando viene eseguita dalla shell, non da ls , quindi non è necessario ls.

Quindi puoi farlo

#!/bin/bash echo *.fastq 

o

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

Commenti

  • eseguendo ls * .fastq sugli output del terminale sulla stessa riga separata da spazi, come fa a metterli su righe separate?
  • Non riesco a trovare i documenti, ma ls restituirà lo stesso risultato di ls -x quando a una tty e come ls -1 quando no. Utilizza quindi ls -x per ottenere ciò che desideri.

Rispondi

Quando fai riferimento a una variabile senza virgolette attorno ad essa (ad esempio echo $files), la shell divide il valore in spazi bianchi e passa ogni termine come unopzione separata della riga di comando. Le nuove righe vengono trattate come qualsiasi altro spazio bianco. Il programma echo non vede affatto i caratteri di nuova riga; riceve solo un array di stringhe, ognuna delle quali è un singolo nome di file.

Quando fai riferimento a una variabile tra virgolette (ad esempio echo "$files"), la shell non “suddivide gli spazi”; invece, passa lintero valore, non modificato, come un singolo argomento. Il programma echo riceve una lunga stringa che include i caratteri di nuova riga.

Variabili a parte, questo è lo stesso comportamento che si ottiene con le virgolette attorno ai valori letterali. Se scrivi echo foo bar, gli spazi vengono rimossi dalla shell e echo ottiene solo le stringhe foo e bar, e stamperà quelle stringhe con un solo spazio tra di loro, poiché è così che è codificato per combinare più argomenti. Se scrivi echo "foo bar", echo ottiene la singola stringa foo bar e la stamperà così comè.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *