Enradstest av innehåll i sträng? [LÖST]

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:

Enradstest av innehåll i sträng? [LÖST]

Inlägg 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”.
Senast redigerad av 1 Johnny Rosenberg, redigerad totalt 22 gånger.
Vänliga hälsningar

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

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Enradstest av innehåll i sträng?

Inlägg 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
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Enradstest av innehåll i sträng?

Inlägg 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
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Enradstest av innehåll i sträng?

Inlägg 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
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Enradstest av innehåll i sträng?

Inlägg 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... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Enradstest av innehåll i sträng?

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

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

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Enradstest av innehåll i sträng? [LÖST]

Inlägg av David Andersson »

Alternativ enradstest

Kod: Markera allt

expr "$Val" : ".*andra"
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
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Enradstest av innehåll i sträng? [LÖST]

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

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

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

Återgå till "Terminalforum"