variabila echo cu conținut din substituirea comenzii

Am scris un script foarte simplu de substituire a comenzilor care este mai jos:

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

Directorul conține o grămadă de fișiere .fastq și vreau doar să folosesc comanda echo pentru a le transmite

Sriptul de mai sus scoate fișiere fastq cu un spațiu între fiecare nume de fișier fastq.

Când îl folosesc în acest mod

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

imprimă rezultatele pe linii noi.

De ce este așa? Are legătură cu înlocuirea comenzii?

Mulțumesc

Răspunde

Când faci referire la o variabilă, este, în general, recomandabil să-i atașați numele între ghilimele duble. Aceasta previne reinterpretarea tuturor caracterelor speciale din șirul citat – cu excepția $, ` (backquote) și \ (evadare). Păstrarea $ ca caracter special în ghilimele duble permite trimiterea la o variabilă citată („$ variabilă”), adică înlocuirea variabilei cu valoarea sa.

Utilizați ghilimele duble pentru a preveni divizarea cuvintelor. Un argument inclus între ghilimele duble se prezintă ca un singur cuvânt, chiar dacă conține separatori de spații albe.

de ex.

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" 

Includerea argumentelor la o declarație ecou între ghilimele duble este necesară numai atunci când este o problemă divizarea cuvintelor sau păstrarea spațiului alb.

Pentru mai multe informații și exemple, accesați aici

Răspundeți

Aveți linii noi, deoarece ls le pune pe linii separate. Noile linii dispar fără ghilimele, deoarece shell-ul (bash) transmite fiecărui text necotat separat la comandă ca argument separat.

Notă: Înlocuirea comenzii se face de către shell, nu de ls , deci nu aveți nevoie de ls.

Prin urmare, puteți face

#!/bin/bash echo *.fastq 

sau

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

Comentarii

  • executând ls * .fastq pe ieșirile terminalului pe aceeași linie separată prin spații, cum le punem pe linii separate atunci?
  • Nu pot găsi documentele, dar ls va ieși la fel ca ls -x când la un tty și ca ls -1 când nu. Prin urmare, utilizați ls -x pentru a obține ceea ce doriți.

Răspuns

Când vă referiți la o variabilă fără ghilimele în jurul ei (de exemplu, echo $files), shell-ul împarte valoarea în spațiul alb și trece fiecare termen ca o opțiune separată de linie de comandă. Newline sunt tratate la fel ca orice alt spațiu alb. Programul echo nu vede deloc caracterele din noua linie; obține doar o serie de șiruri, fiecare dintre acestea fiind un singur nume de fișier.

Când vă referiți la o variabilă între ghilimele (ex. echo "$files"), shell-ul nu face nici o divizare a spațiului alb; în schimb, transmite întreaga valoare, nemodificată, ca argument unic . Programul echo primește un șir lung care include caracterele newline.

Variabile deoparte, acesta este același comportament pe care îl obțineți cu ghilimele în jurul valorilor literale. Dacă scrieți echo foo bar, spațiile sunt eliminate de coajă și echo obține doar șirurile foo și bar și va imprima acele șiruri cu un singur spațiu între ele, deoarece așa se codifică pentru a combina mai multe argumente. Dacă scrieți echo "foo bar", echo primește șirul unic foo bar și îl va imprima așa cum este.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *