echo-variabele met inhoud van opdrachtvervanging

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

  • ls * .fastq draaien op de terminaluitgangen op dezelfde regel gescheiden door spaties, hoe zet ik ze dan op aparte regels?
  • Ik kan de documenten niet vinden, maar ls zal hetzelfde uitvoeren als ls -x when to a tty, en like ls -1 wanneer niet. Gebruik daarom ls -x om te krijgen wat je wilt.

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *