Nu vill jag dock utesluta alla nummer som startar med 0, så:
Kod: Markera allt
if (( x < 10**5 )); then
#gör någonting
else
#gör någonting annat
fi
Finns något enkelt sätt att kringgå detta, eller måste jag göra en strängjämförelse istället?
Kod: Markera allt
if (( x < 10**5 )); then
#gör någonting
else
#gör någonting annat
fi
Kod: Markera allt
if [[ $x < "100000" ]]; then
# Gör någonting
else
# Gör någonting helt annat
fi
Kod: Markera allt
x=0002
echo ${x#0*}
==>
2
Kod: Markera allt
if (( ${x#0*} < 10**5 )); then
#gör någonting
else
#gör någonting annat
fi
Ah, visst ja, tänkte inte på det. Borde skriva skript lite oftare så att jag blir van vid de olika sätten att göra saker på. Har i alla fall märkt att det går lite lättare numera och jag behöver inte söka upp precis allting, en del sitter faktiskt kvar i minnet. Dock ej just detta, tydligen.mcNisse skrev:Det finns ett enkelt sätt filtrera variabler.
${var#mönster} variabeln var filtreras från starten utfrån mönster.
% filtrerar bakifrån och dubbla förekomster filtrerar den längsta matchande strängen.
matchar ingen returneras orginalvärdet.
texKod: Markera allt
x=0002 echo ${x#0*} ==> 2
Kod: Markera allt
~$ x=0002
~$ echo ${x#0*}
002
~$
Kod: Markera allt
~$ x=0002
~$ echo ${x##+(0)}
2
~$
Kod: Markera allt
~$ echo ${x/#+(0)/}
~$ 2
Kod: Markera allt
~$ echo ${x/#0/}
~$ 002
Det verkar inte heller fungera:mcNisse skrev:Det stämmer bra... Jag testade bara med en inledande 0 :-( Inget bra exempel :-(
Du får lov att använda ## om du vill ta bort flera.
Kod: Markera allt
~$ x=0002
~$ echo ${x##0*}
~$
Ja, det verkar ju bra, allt det där. En sak som jag stör mig lite på är ändå att man prompt måste ha sitt eget sätt att göra det på. Som användare måste man då lära sig flera olika syntaxer för samma sak. Vad kan man göra med ovanstående syntax som man inte kan göra med den syntax som exempelvis sed använder?mcNisse skrev:Jag tänkte inte igenom problemet tillräckligt bra![]()
Kommandot använder sig av glob göra matchningen. Det gör att det inte finns någon sätt att matcha en eller flera tecken i början av en sträng.
Som tur är använder sig bash av extglob. Detta ger ytterligare några varianter att använda sig av:
?(<PATTERN-LIST>) Matches zero or one occurrence of the given patterns
*(<PATTERN-LIST>) Matches zero or more occurrences of the given patterns
+(<PATTERN-LIST>) Matches one or more occurrences of the given patterns
@(<PATTERN-LIST>) Matches one of the given patterns
!(<PATTERN-LIST>) Matches anything except one of the given patterns
Detta förklarar hur ${x/#+(0)/} fungerar, substituera 1 ellel flera 0 i början av strängen mot tomma strängen.
En annan variant med ## operatorn blir ${x##+(0)}.
Du kan explicit ange att talet är decimalt även om det börjar med noll:Johnny Rosenberg skrev:Problemet tycks vara att tal som startar med 0 ses som oktala och om en siffra > 7 ingår där (ej tillåtet i oktala tal) så blir det ett felmeddelande istället.
Finns något enkelt sätt att kringgå detta, eller måste jag göra en strängjämförelse istället?
Kod: Markera allt
x=089
if (( 10#$x == 89 ))
then echo ja
else echo nej
fi
Oj, det där var något nytt för mig! Har du någon länk där man kan läsa mer om detta?Konservburk skrev:Du kan explicit ange att talet är decimalt även om det börjar med noll:
Kod: Markera allt
x=089 if (( 10#$x == 89 )) then echo ja else echo nej fi
http://www.gnu.org/software/bash/manual ... metic.htmlJohnny Rosenberg skrev:Oj, det där var något nytt för mig! Har du någon länk där man kan läsa mer om detta?