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
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.
ls
va ieși la fel cals -x
când la un tty și cals -1
când nu. Prin urmare, utilizațils -x
pentru a obține ceea ce doriți.