Sida 1 av 1

Konstigt med echo med kommando och sträng

Postat: 01 okt 2008, 12:15
av Osprey
Vad kommer det sig att två tillsynes likvärdiga kommandon ger olika resultat, iofs bara lite men ändå..??

Först ger vi kommandot (date) innan textsträngen:
magnus@homer:/etc# echo `date`"foo"
ons okt 1 12:08:22 CEST 2008foo
och då får vi alltså ett mellanslag mellan "okt" och "1".

Sedan ger vi kommandot "inne i" textsträngen
magnus@homer:/etc# echo "`date`foo"
ons okt 1 12:08:33 CEST 2008foo
och som synes så är det plötsligt två mellanslag mellan "okt" och "1"...

Jag begriper ingenting och förstår inte hur det här kan påverka de utskrifter som kommer från date. Kommandot kan väl inte rimligtvis veta om i vilken kontext det exekverar..???

[Edit] Jag såg att forumet rensar bort de dubbla mellanslagen och ersätter dem med ett. Men resultatet blir iallafall som det blir och ni kan prova själva.

Re: Konstigt med echo med kommando och sträng

Postat: 01 okt 2008, 12:34
av Konservburk
Osprey skrev:Vad kommer det sig att två tillsynes likvärdiga kommandon ger olika resultat, iofs bara lite men ändå..??
De inte inte likvärdiga kommandon, vilket du redan har märkt.
Osprey skrev:Jag begriper ingenting och förstår inte hur det här kan påverka de utskrifter som kommer från date. Kommandot kan väl inte rimligtvis veta om i vilken kontext det exekverar..???
Det stämmer att date inte vet någonting om detta. Saken är den att skalet utför så kallad "Word Splitting", dvs delar upp i ord för ord, med resultatet att det bara blir ett mellanrum mellan varje ord kvar. Från manualbladet:

Kod: Markera allt

   Word Splitting
       The shell scans the results of parameter expansion,  command  substitu-
       tion,  and arithmetic expansion that did not occur within double quotes
       for word splitting.
Om du har `date` inne i strängen så utförs aldrig någon "World Splitting", och resultatet blir som det hade blivit om du hade kört date löst:

Kod: Markera allt

$ date
Wed Oct  1 12:32:53 CEST 2008
$ echo "`date`"
Wed Oct  1 12:32:53 CEST 2008
$ echo `date`
Wed Oct 1 12:32:53 CEST 2008
Osprey skrev:Jag såg att forumet rensar bort de dubbla mellanslagen och ersätter dem med ett.
Använd

Kod: Markera allt

 så slipper du problemet.

Re: Konstigt med echo med kommando och sträng

Postat: 01 okt 2008, 12:37
av Konservburk
Vi kan ju även ta ett exempel där "Word Splitting" spelar betydligt större roll än ett mellanrum som försvinner:

Kod: Markera allt

$ for i in "`date`"; do echo "$i"; done
Wed Oct  1 12:36:40 CEST 2008
$ for i in `date`; do echo "$i"; done
Wed
Oct
1
12:36:40
CEST
2008

Re: Konstigt med echo med kommando och sträng

Postat: 01 okt 2008, 13:57
av Osprey
Aha, tack så mycket för svaret, nu har jag lärt mig något nytt!! :D