ekkovariabel med indhold fra kommandosubstitution

Jeg skrev et meget grundlæggende script til kommandosubstitution, som er nedenfor:

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

Mappen indeholder en række .fastq-filer, og jeg vil bare bruge echo-kommandoen til at udføre dem

Ovenstående sript udsender fastq-filer med et mellemrum mellem hvert fastq-filnavn.

Når jeg bruger det på denne måde

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

udskriver det resultaterne på nye linjer.

Hvorfor er det sådan? Er det noget at gøre med kommandosubstitution?

Tak

Svar

Når der henvises til en variabel, er det anbefales generelt at omslutte sit navn i dobbelt anførselstegn. Dette forhindrer genfortolkning af alle specialtegn i den citerede streng – undtagen $, ` (backquote) og \ (flugt). Hvis du holder $ som et specialtegn inden for dobbelt anførselstegn, kan du henvise til en citeret variabel (“$ variabel”), dvs. erstatte variablen med dens værdi.

Brug dobbelt anførselstegn for at forhindre opdeling af ord. Et argument indeholdt i dobbelt anførselstegn præsenterer sig selv som et enkelt ord, selvom det indeholder mellemrumsudskillere.

f.eks.

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" 

Det er kun nødvendigt at omslutte argumenterne til et ekko-udsagn i dobbelt anførselstegn, når ordopdeling eller bevarelse af mellemrum er et problem.

For mere info og eksempler gå her

Svar

Du har nye linjer, fordi ls sætter dem på separate linjer. De nye linjer forsvinder uden anførselstegn, fordi skallen (bash) sender hver ikke-citeret plads-adskilt tekst til kommandoen som et separat argument.

Bemærk: Kommandosubstitutionen udføres af skallen ikke af ls , så du behøver ikke ls.

Derfor kan du gøre

#!/bin/bash echo *.fastq 

eller

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

Kommentarer

  • kører ls * .fastq på terminaludgangene på den samme linje adskilt af mellemrum, hvordan placerer vi dem på separate linjer da?
  • Jeg kan ikke finde dokumenterne, men ls vil sende det samme som ls -x hvornår til en tty, og som ls -1 når ikke. Brug derfor ls -x for at få det, du vil have.

Svar

Når du henviser til en variabel uden anførselstegn omkring den (f.eks. echo $files), opdeler skallen værdien fra hinanden i det hvide område og sender hvert udtryk som en separat kommandolinjemulighed. Newlines behandles det samme som ethvert andet hvidt rum. echo -programmet ser slet ikke de nye linjetegn; det får bare en række strenge, der hver er et enkelt filnavn.

Når du refererer til en variabel i anførselstegn (f.eks. echo "$files"), gør skallen ikke nogen opdeling i det hvide rum; i stedet overfører den hele værdien, umodificeret, som et enkelt argument. echo -programmet modtager en lang streng, der inkluderer de nye linjetegn.

Variabler til side, dette er den samme adfærd, du får med anførselstegn omkring bogstavelige værdier. Hvis du skriver echo foo bar, fjernes mellemrummene af skallen, og echo får bare strengene foo og bar, og det “vil udskrive disse strenge med et enkelt mellemrum imellem, da det er sådan, det er kodet til at kombinere flere argumenter. Hvis du skriver echo "foo bar", echo får enkeltstrengen foo bar og udskriver den som den er.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *