Vad i…?? Substitution av strängar i Bash…

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Vad i…?? Substitution av strängar i Bash…

Inlägg 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)
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Vad i…?? Substitution av strängar i Bash…

Inlägg 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.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

Re: Vad i…?? Substitution av strängar i Bash…

Inlägg 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 ???

Kod: Markera allt

. ./skript.sh

Kod: Markera allt

./skript.sh
Men jag inser inte hur

Kod: Markera allt

tid=00 
echo $((10#$t))
skulle fungera annorlunda än

Kod: Markera allt

tid=00
echo ${tid#0}
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Vad i…?? Substitution av strängar i Bash…

Inlägg av Johnny Rosenberg »

mcNisse skrev:Men jag inser inte hur

Kod: Markera allt

tid=00 
echo $((10#$t))
skulle fungera annorlunda än

Kod: Markera allt

tid=00
echo ${tid#0}
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… :P

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å… :D
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

Re: Vad i…?? Substitution av strängar i Bash…

Inlägg 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)}
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Vad i…?? Substitution av strängar i Bash…

Inlägg 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…?
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Skriv svar

Återgå till "Terminalforum"