ekovariabel med innehåll från kommandosubstitution

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

  • kör ls * .fastq på terminalutgångarna på samma rad åtskilda av mellanslag, hur sätter jag dem på separata rader då?
  • Jag kan inte hitta dokumenten, men ls kommer att mata ut samma som ls -x när till en tty, och som ls -1 när inte. Använd därför ls -x för att få det du vill ha.

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *