A parancs behelyettesítésének egy nagyon egyszerű szkriptjét írtam, amely az alábbiakban található:
#!/bin/bash files=$(ls *.fastq); echo $files
A könyvtár egy csomó .fastq fájlt tartalmaz, és csak az echo paranccsal szeretném kimenni őket.
A fenti szkript a fastq fájlokat adja ki, az egyes fastq fájlnevek között szóköz van.
Amikor ilyen módon használom
#!/bin/bash files=$(ls *.fastq); echo "$files"
új sorokra nyomtatja ki az eredményeket.
Miért van így? Valami köze van a parancs behelyettesítéséhez?
Köszönöm
Válasz
Amikor egy változóra hivatkozunk, akkor nevét általában ajánlatos dupla idézőjelek közé tenni. Ez megakadályozza az idézett karaktersorozaton belüli összes speciális karakter újbóli értelmezését – kivéve a $
, `
(backquote) és a \
(menekülés). A $
speciális karakterként történő megtartása a dupla idézőjelek között lehetővé teszi az idézett változóra (“$ változó”) való hivatkozást, vagyis a változó cseréjét az értékével.
Használja dupla idézőjelek a szófelosztás megakadályozására. A dupla idézőjelekbe foglalt argumentum egyetlen szóként jelenik meg, még akkor is, ha szóköz elválasztókat tartalmaz.
pl.
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"
Az argumentumok echo utasításhoz dupla idézőjelben történő csatolása csak akkor szükséges, ha kérdés a szófelosztás vagy a szóköz megőrzése.
További információért és példákért ide
Válasz
Új sorai vannak, mert a ls
külön sorokra helyezi őket. Az új sorok idézőjelek nélkül tűnnek el, mert a shell (bash) minden nem idézett szóközzel elválasztott szöveget külön argumentumként továbbít a parancsnak.
Megjegyzés: A parancscserét a shell, , és nem a ls
, tehát nincs szüksége ls
-re.
Ezért megteheti
#!/bin/bash echo *.fastq
vagy
#!/bin/bash files="*.fastq" echo "$files"
megjegyzések
Válasz
Ha olyan változóra hivatkozik, amely körül idézőjelek nincsenek (pl. echo $files
), akkor a héj szétválasztja az értéket a szóközben, és az egyes kifejezéseket külön parancssori opcióként adja át. Az új sorokat ugyanúgy kezeljük, mint a többi szóközt. A echo
program egyáltalán nem látja az újsoros karaktereket, csak egy sor karakterláncot kap, amelyek mindegyike egyetlen fájlnév.
Amikor hivatkozol az idézőjelben szereplő változóra (pl. echo "$files"
), a shell nem hajt végre hasítékot; ehelyett a teljes értéket módosítatlanul egyetlen argumentumként adja át. A echo
program egy hosszú karakterláncot kap, amely tartalmazza az új sor karaktereit.
A változókat félretéve, ez ugyanaz a viselkedés, mint a szó szerinti értékek körüli idézőjelekkel. Ha a következőt írja: echo foo bar
, akkor a héj eltávolítja a szóközöket, és echo
csak a foo
és bar
, és “kinyomtatja ezeket a karaktersorozatokat egyetlen szóközzel, mivel ez kódolja a több argumentum kombinálását. Ha echo "foo bar"
, echo
megkapja az egyetlen sztringet foo bar
, és a jelenlegi állapotában kinyomtatja.
ls
fájl ugyanaz lesz, mint als -x
mikor egy tty-re, és mintls -1
, amikor nem. Ezért használja als -x
elemet a kívánt eléréshez.