echo változó tartalommal a parancs behelyettesítéséből

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

  • ls * .fastq futtatása a terminál kimenetein ugyanazon a vonalon, szóközökkel elválasztva, akkor hogyan állítom őket külön sorokra?
  • Nem találom a doc-okat, de a ls fájl ugyanaz lesz, mint a ls -x mikor egy tty-re, és mint ls -1, amikor nem. Ezért használja a ls -x elemet a kívánt eléréshez.

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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük