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
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.
ls
vil sende det samme somls -x
hvornår til en tty, og somls -1
når ikke. Brug derforls -x
for at få det, du vil have.