Sida 1 av 1
Vad i…?? Substitution av strängar i Bash…
Postat: 13 sep 2014, 21:42
av Johnny Rosenberg
Kod: Markera allt
#!/bin/bash
# Diverse kod som går ut på att användaren matar in en tid som hh:mm:ss.
# Låt oss säga att användaren matade in 00:00:09.
echo $Tid # Allt okej här. Visar 00:00:09 som sig bör.
# Separera timmar, minuter och sekunder.
Timmar=$(echo $Tid | awk -F ":" '{print $1}')
Minuter=$(echo $Tid | awk -F ":" '{print $2}')
Sekunder=$(echo $Tid | awk -F ":" '{print $3}')
echo "${Timmar}:${Minuter}:${Sekunder}" # Okej här också, visar 00:00:09 som sig bör.
# Ta bort eventuella inledande nollor.
Timmar=${Timmar##+(0)}
Minuter=${Minuter##+(0)}
Sekunder=${Sekunder##+(0)}
echo "${Timmar}:${Minuter}:${Sekunder}" # Borde visa ::9, visar 00:00:09!
Det roliga är att när jag kör kommandona separat i terminalen så blir det rätt:
Kod: Markera allt
bin$ Tid=00:00:09
bin$ echo $Tid
00:00:09
bin$
bin$ # Separera timmar, minuter och sekunder.
bin$ Timmar=$(echo $Tid | awk -F ":" '{print $1}')
bin$ Minuter=$(echo $Tid | awk -F ":" '{print $2}')
bin$ Sekunder=$(echo $Tid | awk -F ":" '{print $3}')
bin$
bin$ echo "${Timmar}:${Minuter}:${Sekunder}"
00:00:09
bin$
bin$ # Ta bort eventuella inledande nollor.
bin$ Timmar=${Timmar##+(0)}
bin$ Minuter=${Minuter##+(0)}
bin$ Sekunder=${Sekunder##+(0)}
bin$
bin$ echo "${Timmar}:${Minuter}:${Sekunder}"
::9
bin$
Vad in i självaste…?? Vad är det som pågår??
Ubuntu 14.04
GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
Re: Vad i…?? Substitution av strängar i Bash…
Postat: 13 sep 2014, 22:05
av Johnny Rosenberg
Nu löste jag problemet genom att gå runt det, men jag vill fortfarande veta varför något kan fungera direkt i terminalen men inte om man kör det som ett skript.
Min lösning blev att tvinga bas 10 istället. Då kunde jag stryka vissa rader som skulle se till att inga värden blev tomma:
Kod: Markera allt
# Ta bort eventuella inledande nollor genom att tvinga värdet till bas 10.
Timmar=$((10#$Timmar))
Minuter=$((10#$Minuter))
Sekunder=$((10#$Sekunder))
Så mitt skript fungerar nu, men varför fungerade det inte förut? Extra skumt med tanke på att det fungerade direkt i terminalen, som sagt.
Re: Vad i…?? Substitution av strängar i Bash…
Postat: 14 sep 2014, 17:35
av mcNisse
Det var ett udda beteende. Bash verkar tappa möjligheten att köra extended globs i skript
Jag testade det själv och det dessa två sätt attt köra skriptet gav olika resultat
Men jag inser inte hur
skulle fungera annorlunda än
Re: Vad i…?? Substitution av strängar i Bash…
Postat: 14 sep 2014, 19:37
av Johnny Rosenberg
mcNisse skrev:Men jag inser inte hur
skulle fungera annorlunda än
Ditt första exempel blir ju lite konstigt i och med att du först sätter ”tid” och sedan använder ”t” på nästa rad, men jag förstår vad du menar…
Kod: Markera allt
~$ tid=0000009
~$ echo $((10#$tid))
9
~$ echo ${tid#0}
000009
~$
Viss skillnad tycks det i alla fall vara på de två olika uttrycken.
Fast jag antar att du syftar på att det ena fungerar i skript medan det andra inte gör det, vilket alltså förbryllar mig också…

Re: Vad i…?? Substitution av strängar i Bash…
Postat: 16 sep 2014, 21:57
av mcNisse
Det handlar om extglob. Av någon anledning är extglob avstängt när man kör skript men enablad då kör skalet interaktivt.
Enabla extglob
shopt -s extglob
Disabla extlob
shopt -u extglob
Här har du ett skript som både hanterer och inte extglop
Kod: Markera allt
#!/bin/bash
tid=00001
echo tid=$tid
echo extglob disabled: ${tid##+(0)}
shopt -s extglob
echo extglob enabled: ${tid##+(0)}
Re: Vad i…?? Substitution av strängar i Bash…
Postat: 17 sep 2014, 20:45
av Johnny Rosenberg
mcNisse skrev:Det handlar om extglob. Av någon anledning är extglob avstängt när man kör skript men enablad då kör skalet interaktivt.
Enabla extglob
shopt -s extglob
Disabla extlob
shopt -u extglob
Här har du ett skript som både hanterer och inte extglop
Kod: Markera allt
#!/bin/bash
tid=00001
echo tid=$tid
echo extglob disabled: ${tid##+(0)}
shopt -s extglob
echo extglob enabled: ${tid##+(0)}
Tackar! Det verkar fungera. Skulle vara intressant att veta varför det är så. Kan väl inte enbart vara för att ge huvudbry åt glada amatörskriptare som jag…?