echo-muuttuja sisällöllä komennon korvaamisesta

Kirjoitin alla olevan komentokomennon perustavanlaatuisen komentosarjan:

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

Hakemisto sisältää joukon .fastq-tiedostoja, ja haluan vain käyttää kaiku-komentoa niiden tuottamiseen

Yllä oleva komentosarja tuottaa fastq-tiedostoja, joissa on väli kunkin fastq-tiedostonimen välissä.

Kun käytän sitä tällä tavalla

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

se tulostaa tulokset uusille riveille.

Miksi se on niin? Onko jotain tekemistä komentojen korvaamisen kanssa?

Kiitos

Vastaa

Kun viitataan muuttujaan, se on yleensä suositeltavaa liittää nimensä lainausmerkkeihin. Tämä estää kaikkien lainattujen merkkijonojen erikoismerkkien uudelleen tulkinnan – paitsi $, ` (backquote) ja \ (paeta). $ -merkin pitäminen erikoismerkkinä kaksoislainauksissa sallii viittauksen lainattuun muuttujaan (”$ muuttuja”), eli korvaamalla muuttuja sen arvolla.

Käytä kaksoislainausmerkit sanojen jakamisen estämiseksi. Kaksi lainausmerkkiin liitetty argumentti esittää itsensä yhtenä sanana, vaikka se sisältää välilyöntejä.

esim.

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" 

Argumenttien sulkeminen kaikulauseeseen kaksoislainausmerkeissä on välttämätöntä vain, kun kysymys on sanojen jakamiseen tai välilyönnin säilyttämiseen.

Lisätietoja ja esimerkkejä on täällä

Vastaa

Sinulla on uusia rivejä, koska ls laittaa ne erillisille riveille. Uudet rivit katoavat ilman lainausmerkkejä, koska kuori (bash) välittää jokaisen noteeraamattomalla välilyönnillä erotetun tekstin komennolle erillisenä argumenttina.

Huomaa: Komennon korvaaminen tapahtuu komentotulkissa, ei ls , joten et tarvitse ls.

Siksi voit tehdä

#!/bin/bash echo *.fastq 

tai

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

kommentit

  • käynnissä ls * .fastq päätelaitteen lähdöissä samalla rivillä, jotka on erotettu välilyönneillä, miten laitan ne sitten erillisille viivoille?
  • En löydä dokumentteja, mutta ls tuottaa saman kuin ls -x milloin tty, ja kuten ls -1, kun ei. Käytä siksi ls -x saadaksesi haluamasi.

Vastaa

Kun viitataan muuttujaan ilman lainausmerkkejä sen ympärillä (esim. echo $files), kuori jakaa arvon erillään välilyönnissä ja välittää jokaisen termin erillisenä komentorivivaihtoehtona. Uusia viivoja kohdellaan samalla tavalla kuin mitä tahansa muuta tyhjää tilaa. echo -ohjelma ei näe lainkaan uuden rivin merkkejä; se saa vain joukon merkkijonoja, joista kukin on yksi tiedostonimi.

Kun viittaat lainausmerkeissä olevaan muuttujaan (esim. echo "$files"), kuori ei tee mitään välilyöntiä; sen sijaan se välittää koko arvon muokkaamattomana yksittäisenä argumenttina. echo -ohjelma vastaanottaa yhden pitkän merkkijonon, joka sisältää uuden rivin merkit.

Muuttujat syrjään, tämä on sama käyttäytyminen kuin lainausmerkillä kirjaimellisten arvojen ympärillä. Jos kirjoitat echo foo bar, kuoret tyhjentävät välilyönnit ja echo saa vain merkkijonot foo ja bar, ja se ”tulostaa nämä merkkijonot yhdellä välilyönnillä, koska se koodaa yhdistämään useita argumentteja. Jos kirjoitat echo "foo bar", echo saa yksittäisen merkkijonon foo bar ja tulostaa sen sellaisenaan.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *