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
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.
ls
tuottaa saman kuinls -x
milloin tty, ja kutenls -1
, kun ei. Käytä siksils -x
saadaksesi haluamasi.