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
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è.
ls
restituirà lo stesso risultato dils -x
quando a una tty e comels -1
quando no. Utilizza quindils -x
per ottenere ciò che desideri.