Jag skrev ett mycket grundläggande script för kommandosubstitution som är nedan:
#!/bin/bash files=$(ls *.fastq); echo $files
Katalogen innehåller en massa .fastq-fil och jag vill bara använda echo-kommandot för att mata ut dem
Ovanstående sript matar ut fastq-filer med ett mellanslag mellan varje fastq-filnamn.
När jag använder det på det här sättet
#!/bin/bash files=$(ls *.fastq); echo "$files"
skriver det ut resultaten på nya rader.
Varför är det så? Är det något att göra med kommandosubstitution?
Tack
Svar
När det hänvisas till en variabel, är det rekommenderas i allmänhet att bifoga sitt namn i dubbla citat. Detta förhindrar nytolkning av alla specialtecken i den citerade strängen – förutom $
, `
(backquote) och \
(fly). Att hålla $
som ett specialtecken inom dubbla citat gör det möjligt att referera till en citerad variabel (”$ variabel”), det vill säga att ersätta variabeln med dess värde.
Använd dubbla citat för att förhindra uppdelning av ord. Ett argument inneslutet i dubbla citat presenterar sig som ett enda ord, även om det innehåller blankstegsseparatorer.
t.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"
Att bifoga argumenten till ett ekouttalande i dubbla citattecken är endast nödvändigt när ordsplitring eller bevarande av det vita utrymmet är ett problem.
För mer info och exempel gå här
Svar
Du har nya rader eftersom ls
placerar dem på separata rader. De nya raderna försvinner utan citaten eftersom skalet (bash) skickar varje ociterad blankstegsseparerad text till kommandot som ett separat argument.
Obs! Kommandosubstitutionen görs av skalet, inte av ls
, så du behöver inte ls
.
Därför kan du göra
#!/bin/bash echo *.fastq
eller
#!/bin/bash files="*.fastq" echo "$files"
Kommentarer
Svar
När du hänvisar till en variabel utan citattecken runt den (t.ex. echo $files
), delar skalet värdet isär i det vita utrymmet och skickar varje term som ett separat kommandoradsalternativ. Newlines behandlas på samma sätt som alla andra blanksteg. echo
-programmet ser inte de nya linjetecknen alls, det får bara en rad strängar, var och en är ett enda filnamn.
När du refererar till en variabel i citattecken (t.ex. echo "$files"
), gör inte skalet någon delning av mellanslag; i stället skickar det hela värdet, omodifierat, som ett enstaka argument. Programmet echo
får en lång sträng som innehåller de nya linjetecknen.
Variabler åt sidan, detta är samma beteende som du får med citat kring bokstavliga värden. Om du skriver echo foo bar
avlägsnas mellanslagen av skalet och echo
får bara strängarna foo
och bar
, och det kommer att skriva ut dessa strängar med ett enda mellanrum, eftersom det är så det är kodat för att kombinera flera argument. Om du skriver echo "foo bar"
, echo
får den enda strängen foo bar
och skriver ut den som den är.
ls
kommer att mata ut samma somls -x
när till en tty, och somls -1
när inte. Använd därförls -x
för att få det du vill ha.