Ik heb een heel eenvoudig script geschreven voor opdrachtvervanging dat hieronder staat:
#!/bin/bash files=$(ls *.fastq); echo $files
De map bevat een heleboel .fastq-bestanden en ik wil gewoon het echo-commando gebruiken om ze uit te voeren
Het bovenstaande sript geeft fastq-bestanden weer met een spatie tussen elke fastq-bestandsnaam.
Als ik het op deze manier gebruik
#!/bin/bash files=$(ls *.fastq); echo "$files"
, worden de resultaten op nieuwe regels afgedrukt.
Waarom is het zo? Heeft het iets te maken met opdrachtvervanging?
Bedankt
Antwoord
Als er wordt verwezen naar een variabele, Het is over het algemeen raadzaam om de naam tussen dubbele aanhalingstekens te plaatsen. Dit voorkomt een herinterpretatie van alle speciale tekens in de tekenreeks tussen aanhalingstekens – behalve $
, `
(citaat in achterwaartse richting) en \
(ontsnappen). Door $
als een speciaal teken tussen dubbele aanhalingstekens te houden, kan worden verwezen naar een variabele tussen aanhalingstekens (“$ variable”), dat wil zeggen, de variabele vervangen door zijn waarde.
Gebruik dubbele aanhalingstekens om woordsplitsing te voorkomen. Een argument tussen dubbele aanhalingstekens presenteert zichzelf als een enkel woord, zelfs als het scheidingstekens voor spaties bevat.
bijv.
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"
De argumenten van een echo-instructie tussen dubbele aanhalingstekens plaatsen is alleen nodig als het splitsen van woorden of het behouden van witruimte een probleem is.
Voor meer info en voorbeelden ga hier
Answer
Je hebt nieuwe regels omdat ls
ze op aparte regels plaatst. De nieuwe regels verdwijnen zonder de aanhalingstekens omdat de shell (bash) elke niet-aanhalingstekens door spaties gescheiden tekst als een afzonderlijk argument doorgeeft aan de opdracht.
Opmerking: de opdrachtvervanging wordt gedaan door de shell, niet door ls
, dus je hebt ls
niet nodig.
Daarom kun je
#!/bin/bash echo *.fastq
of
#!/bin/bash files="*.fastq" echo "$files"
Reacties
Answer
Als je naar een variabele verwijst zonder aanhalingstekens eromheen (bijv. echo $files
), splitst de shell de waarde op in witruimte en geeft elke term door als een aparte opdrachtregeloptie. Nieuwe regels worden op dezelfde manier behandeld als elke andere witruimte. Het echo
programma “ziet de tekens van de nieuwe regel helemaal niet; het krijgt alleen een reeks strings, die elk een enkele bestandsnaam zijn.
Wanneer u verwijst naar een variabele tussen aanhalingstekens (bijv. echo "$files"
), doet de shell geen “spatiesplitsing”; in plaats daarvan geeft het de volledige waarde, ongewijzigd, door als een enkel argument. Het echo
programma ontvangt een lange string die de newline karakters bevat.
Variabelen opzij, dit is hetzelfde gedrag dat je krijgt met aanhalingstekens rond letterlijke waarden. Als je echo foo bar
schrijft, worden de spaties verwijderd door de shell en echo
krijgt alleen de strings foo
en bar
, en het “zal die strings afdrukken met een enkele spatie ertussen, aangezien het zo is gecodeerd om meerdere argumenten te combineren. Als je schrijft echo "foo bar"
, echo
haalt de enkele string foo bar
op en drukt deze af zoals hij is.
ls
zal hetzelfde uitvoeren alsls -x
when to a tty, en likels -1
wanneer niet. Gebruik daaromls -x
om te krijgen wat je wilt.