Sida 1 av 1
Enradstest av innehåll i sträng? [LÖST]
Postat: 21 feb 2009, 23:54
av Johnny Rosenberg
Har fortsatt larva mig med Xdialog ett tag och hittat nya fräscha problem. Just detta problem kan jag enkelt lösa, men jag vill ha en enradslösning och det får jag inte till riktigt…
Jag använder
Val=$(Xdialog --stdout --checklist… … …) för att välja saker som skriptet senare ska ta hänsyn till. I just detta fall är det två saker jag kan kryssa i, låt oss kalla dem ”första” och ”andra” i detta inlägg.
Variableln Val kan då få ett av fyra värden:
- [Tom sträng]
- ”första”
- ”andra”
- ”första/andra”
Anta nu att jag vill kolla om användaren kryssat i ”andra”. Jag skulle ju kunna lösa det på flera rader:
Kod: Markera allt
#!/bin/sh
Val=$(Xdialog --stdout --checklist "Blaha" 12 45 3 "första" "Detta är första" off "andra" "Detta är andra" off)
if [ ! $? ]; then
exit 1
else
echo "${Val}" > /dev/null | grep "andra"
if [ $? ]; then
echo "Se där, du valde andra trots allt!"
else
echo "Nu tror jag minsann att du glömde kryssa i en viss ruta här!"
fi
fi
Vad jag skulle vilja göra är att ersätta raderna
Kod: Markera allt
echo "${Val}" > /dev/null | grep "andra"
if [ $? ]; then
med en enda rad av denna typ:
Kod: Markera allt
if <strängen "andra" finns någonstans i strängen "${Val}">; then
Är detta möjligt? Lösningen ska helst också fungera om man har flera val än de två i detta exempel, exempelvis om ${Val} innehåller ”första/andra/tredje/fjärde/femte”.
Re: Enradstest av innehåll i sträng?
Postat: 22 feb 2009, 00:06
av Osprey
Menar du typ:
Kod: Markera allt
if [[ $(echo $Val | awk '{ i=index($1,"andra"); print i }') != 0 ]]; then
echo YES
else
echo NO
fi
Re: Enradstest av innehåll i sträng?
Postat: 22 feb 2009, 00:10
av Konservburk
Johnny Rosenberg skrev:Kod: Markera allt
if <strängen "andra" finns någonstans i strängen "${Val}">; then
Är detta möjligt? Lösningen ska helst också fungera om man har flera val än de två i detta exempel, exempelvis om ${Val} innehåller ”första/andra/tredje/fjärde/femte”.
Låter lite som att du vill använda en case-sats...
Kod: Markera allt
case "$Val" in *andra*) echo JA ;; *) echo NEJ ;; esac
Re: Enradstest av innehåll i sträng?
Postat: 22 feb 2009, 00:14
av Konservburk
Osprey skrev:Kod: Markera allt
if [[ $(echo $Val | awk '{ i=index($1,"andra"); print i }') != 0 ]]; then
echo YES
else
echo NO
fi
Det där verkar väldigt komplicerat... varför inte bara flytta in
echo $Val | grep andra i if-satsen?
Kod: Markera allt
if echo $Val | grep -q andra
then echo JA
else echo NEJ
fi
Re: Enradstest av innehåll i sträng?
Postat: 22 feb 2009, 01:16
av Osprey
Konservburk skrev:Det där verkar väldigt komplicerat... varför inte bara flytta in echo $Val | grep andra i if-satsen?
Rätt, det är jag som är för trött...

Re: Enradstest av innehåll i sträng?
Postat: 22 feb 2009, 12:47
av Johnny Rosenberg
Konservburk skrev:Kod: Markera allt
if echo $Val | grep -q andra
then echo JA
else echo NEJ
fi
Jag var också för trött, tydligen. Eller så har jag inte lärt mig tänka på rätt sätt än. Skalprogrammering skiljer sig ju rätt rejält från exempelvis C-programmering som väl är det jag kan bäst när det gäller programmering, även om jag är på nybörjarstadiet även där.
Det ser ju så självklart ut nu när man ser det, så man skäms nästan för att man frågade… Och hoppas ingen studerade mitt lite längre exempel för noga, för jag såg just att det inte bara var klumpigt, det hade inte heller fungerat… men titta inte på det nu, är ni snälla…
Har en annan fråga som kanske är lite svårare, men den handlar om Xdialog och kommer snart i en ny tråd nära dig…

Re: Enradstest av innehåll i sträng? [LÖST]
Postat: 26 feb 2009, 19:27
av David Andersson
Alternativ enradstest
Returnerar true (0) eller false (1) i status och antal matchande tecken i stdout. Exempel tyst i if-sats:
Kod: Markera allt
if expr "$Val" : ".*andra" >/dev/null; then
....
fi
I detta fall när det är fyra testfall, så gå på Konservburks förslag med case. Då får koden samma struktur som specen, vilken är
väldigt bra ur kvalitetshänseende:
Kod: Markera allt
case "$Val" in
"") ...;;
"första") ...;;
"andra") ...;;
"första/andra") ...;;
esac
Re: Enradstest av innehåll i sträng? [LÖST]
Postat: 27 feb 2009, 20:15
av Johnny Rosenberg
David Andersson skrev:I detta fall när det är fyra testfall, så gå på Konservburks förslag med case. Då får koden samma struktur som specen, vilken är
väldigt bra ur kvalitetshänseende:
Kod: Markera allt
case "$Val" in
"") ...;;
"första") ...;;
"andra") ...;;
"första/andra") ...;;
esac
Jo, fast om det är många alternativ, så blir det ju väldigt många villkor… Om vi säger att man har 14 kryssrutor att bocka i, så blir det ju 16384 fall att ta hänsyn till… Då är det ju smidigare att kolla första först och göra vad som ska göras om den är vald och så vidare. Beror ju lite på hur skriptet är uppbyggt i övrigt och vad som ska göras i de olika fallen, i och för sig.