Problem med skript

Här diskuteras programmering och utveckling
Användarvisningsbild
AntonPetts
Inlägg: 316
Blev medlem: 27 apr 2008, 23:01
OS: Arch Linux
Ort: Kalmar
Kontakt:

Problem med skript

Inlägg av AntonPetts »

Jag håller på med ett bash-skript, men har kört fast lite :P.

Så här ser den delen av koden ut:

Kod: Markera allt

for file in ./themes/*; do
echo $i "$file" | sed -e 's/.\/themes\///g'
theme[$i]="$file"
done
Den listar alltså alla filer i ./themes, men jag måste få in en växande variabel "$i" också så jag kan numrera filerna. Kanske en while-loop eller nåt?
Mina teman: iod Suite, SimplyGrey
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Problem med skript

Inlägg av Lars »

Så här kanske:

Kod: Markera allt

i=0
for file in ./themes/*; do
   echo $i "$file" | sed -e 's/.\/themes\///g'
   theme[$i]="$file"
   i=$((i+1))
done
Användarvisningsbild
AntonPetts
Inlägg: 316
Blev medlem: 27 apr 2008, 23:01
OS: Arch Linux
Ort: Kalmar
Kontakt:

Re: Problem med skript

Inlägg av AntonPetts »

haha, ja så lätt var det :D

Någon som vet hur man lägger till flaggor i ett skript?
Mina teman: iod Suite, SimplyGrey
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Problem med skript

Inlägg av Konservburk »

AntonPetts skrev:Någon som vet hur man lägger till flaggor i ett skript?
"flaggorna" dyker upp bland de andra argumenten som $1, $2, $3, osv.

Men vill du göra det snyggt så är det getopts som gäller:

Kod: Markera allt

while getopts ab: OPT
do case $OPT in \?)
   ;; a) echo flaggan -a hittad
   ;; b) echo flaggan -b hittad med argument: "$OPTARG"
   esac
done
Användarvisningsbild
AntonPetts
Inlägg: 316
Blev medlem: 27 apr 2008, 23:01
OS: Arch Linux
Ort: Kalmar
Kontakt:

Re: Problem med skript

Inlägg av AntonPetts »

Konservburk skrev:

Kod: Markera allt

while getopts ab: OPT
do case $OPT in \?)
   ;; a) echo flaggan -a hittad
   ;; b) echo flaggan -b hittad med argument: "$OPTARG"
   esac
done
tror du att du kan förklara det där lite mer? Jag lyckades inte lägga till fler flaggor :P

just nu vill jag ha 4 flaggor med argument och 3 utan :)
Mina teman: iod Suite, SimplyGrey
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Problem med skript

Inlägg av Konservburk »

help getopts ger dig en fullständig förklaring

Kod: Markera allt

while getopts ab:c:d OPT
do case $OPT in \?)
   ;; a) echo flaggan -a hittad
   ;; b) echo flaggan -b hittad med argument: "$OPTARG"
   ;; c) echo flaggan -c hittad med argument: "$OPTARG"
   ;; d) echo flaggan -d hittad
   esac
done
Användarvisningsbild
AntonPetts
Inlägg: 316
Blev medlem: 27 apr 2008, 23:01
OS: Arch Linux
Ort: Kalmar
Kontakt:

Re: Problem med skript

Inlägg av AntonPetts »

Konservburk skrev:help getopts ger dig en fullständig förklaring
Tyvärr inte, man hittar inget heller (jag kör inte ubuntu)
Fast jag förstår nu efter andra exemplet :D
Mina teman: iod Suite, SimplyGrey
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Problem med skript

Inlägg av Konservburk »

AntonPetts skrev:
Konservburk skrev:help getopts ger dig en fullständig förklaring
Tyvärr inte, man hittar inget heller (jag kör inte ubuntu)
Sök efter getopts i man bash så borde du hitta det ;)

Men jag kan ju klistra in det här så blir det inga tvivel om saken:

Kod: Markera allt

       getopts optstring name [args]
              getopts  is used by shell procedures to parse positional parame-
              ters.  optstring contains the option  characters  to  be  recog-
              nized;  if  a  character  is  followed by a colon, the option is
              expected to have an argument, which should be separated from  it
              by  white space.  The colon and question mark characters may not
              be used as option characters.  Each time it is invoked,  getopts
              places  the next option in the shell variable name, initializing
              name if it does not exist, and the index of the next argument to
              be processed into the variable OPTIND.  OPTIND is initialized to
              1 each time the shell or a shell script  is  invoked.   When  an
              option  requires  an argument, getopts places that argument into
              the variable OPTARG.  The shell does not reset OPTIND  automati-
              cally;  it  must  be  manually  reset  between multiple calls to
              getopts within the same shell invocation if a new set of parame-
              ters is to be used.

              When  the  end  of  options is encountered, getopts exits with a
              return value greater than zero.  OPTIND is set to the  index  of
              the first non-option argument, and name is set to ?.

              getopts  normally  parses the positional parameters, but if more
              arguments are given in args, getopts parses those instead.

              getopts can report errors in two ways.  If the  first  character
              of  optstring  is  a  colon, silent error reporting is used.  In
              normal operation diagnostic messages are  printed  when  invalid
              options  or  missing  option  arguments are encountered.  If the
              variable OPTERR is set to 0, no  error  messages  will  be  dis-
              played, even if the first character of optstring is not a colon.

              If an invalid option is seen, getopts places ? into name and, if
              not  silent,  prints  an  error  message  and unsets OPTARG.  If
              getopts is silent, the  option  character  found  is  placed  in
              OPTARG and no diagnostic message is printed.

              If  a required argument is not found, and getopts is not silent,
              a question mark (?) is placed in name, OPTARG is  unset,  and  a
              diagnostic  message  is  printed.   If getopts is silent, then a
              colon (:) is placed in name and OPTARG  is  set  to  the  option
              character found.

              getopts  returns true if an option, specified or unspecified, is
              found.  It returns false if the end of options is encountered or
              an error occurs.
Användarvisningsbild
AntonPetts
Inlägg: 316
Blev medlem: 27 apr 2008, 23:01
OS: Arch Linux
Ort: Kalmar
Kontakt:

Re: Problem med skript

Inlägg av AntonPetts »

Konservburk skrev:
AntonPetts skrev:
Konservburk skrev:help getopts ger dig en fullständig förklaring
Tyvärr inte, man hittar inget heller (jag kör inte ubuntu)
Sök efter getopts i man bash så borde du hitta det ;)
ok, tack för hjälpen :)

Om någon vill kolla på skriptet som det ser ut nu: länk ;D
Mina teman: iod Suite, SimplyGrey
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Problem med skript

Inlägg av Konservburk »

AntonPetts skrev:Om någon vill kolla på skriptet som det ser ut nu: länk ;D
Vad har du för kass tidsinställning egentligen?

Kod: Markera allt

$ tar -xvjf 95383-smiley-generator-v0.3.tar.bz2 
smiley-generator/
smiley-generator/smiley-generator.sh
tar: smiley-generator/smiley-generator.sh: time stamp 2008-12-21 19:08:59 is 335.925613166 s in the future
smiley-generator/themes/
smiley-generator/themes/modern
smiley-generator/themes/standard
tar: smiley-generator: time stamp 2008-12-21 19:16:44 is 800.924252035 s in the future
800.924252035 s in the future är inte lite fel :P

Jag kollade lite snabbt på skriptet, och det första jag lägger märke till är att du kör med #!/bin/sh trots att du använder syntax som inte stöds av t.ex. den version av sh som följer med ubuntu.

Du bör byta ut det till #!/bin/bash eller ändra koden så att den faktiskt blir sh-portabel.
Användarvisningsbild
AntonPetts
Inlägg: 316
Blev medlem: 27 apr 2008, 23:01
OS: Arch Linux
Ort: Kalmar
Kontakt:

Re: Problem med skript

Inlägg av AntonPetts »

Konservburk skrev:[Vad har du för kass tidsinställning egentligen?
XD
Ska fixa det direkt :P
Konservburk skrev: Jag kollade lite snabbt på skriptet, och det första jag lägger märke till är att du kör med #!/bin/sh trots att du använder syntax som inte stöds av t.ex. den version av sh som följer med ubuntu.

Du bör byta ut det till #!/bin/bash eller ändra koden så att den faktiskt blir sh-portabel.
ok, det hade jag ingen aning om, tack :)
Mina teman: iod Suite, SimplyGrey
Användarvisningsbild
AntonPetts
Inlägg: 316
Blev medlem: 27 apr 2008, 23:01
OS: Arch Linux
Ort: Kalmar
Kontakt:

Re: Problem med skript

Inlägg av AntonPetts »

En sak till! :)

Jag skulle behöva sätta en variabel till en del av en fil
Ungefär så här:

Kod: Markera allt

variabel = början till $variabel2 i $fil
Borde väl gå att få till med sed? eller finns det något bättre sätt? :D
Mina teman: iod Suite, SimplyGrey
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Problem med skript

Inlägg av Konservburk »

Det portabla sättet:

Kod: Markera allt

$ VAR=potatisskalare
$ echo ${VAR%are}
potatisskal
Det går att matcha med * också:

Kod: Markera allt

$ echo ${VAR%a*}
potatisskal
Använd två %% för att den ska gå på den längsta möjliga matchningen istället för den kortaste:

Kod: Markera allt

$ echo ${VAR%%a*}
pot
För att plocka bort början istället för slutet så använder du # istället för %:

Kod: Markera allt

$ echo ${VAR#*s}
skalare
Det går t.ex. alldeles utmärkt att använda "${FIL##*/}" istället för `basename "$FIL"` och på motsvarande sätt "${FIL%/*}" istället för `dirname "$FIL"`.
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Problem med skript

Inlägg av David Andersson »

Konservburk skrev: Det går t.ex. alldeles utmärkt att använda "${FIL##*/}" istället för `basename "$FIL"` och på motsvarande sätt "${FIL%/*}" istället för `dirname "$FIL"`.
Nä.

Det här (dirname och basename) garanterar att ls kommer till samma ställe, oavsett om FIL är absolut eller relativ:

Kod: Markera allt

ls "$FIL"
DIR=`dirname "$FIL"`
BASE=`basename "$FIL"`
ls "$DIR/$BASE"
Det här (mönsterborttagning) funkar inte om FIL är en relativ path till aktuell katalog (utan dir-del):

Kod: Markera allt

ls "$FIL"
DIR=${FIL%/*}
BASE=${FIL##*/}
ls "$DIR/$BASE"
Uppdelningen i bas och dir blir olika om FIL har en avslutande slash. Om det är bra eller dåligt (eller inte spelar roll) beror på hur det används.

Dirname och basename funkar inte om FIL har ett avslutande newline i namnet.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Problem med skript

Inlägg av Konservburk »

David Andersson skrev:
Konservburk skrev: Det går t.ex. alldeles utmärkt att använda "${FIL##*/}" istället för `basename "$FIL"` och på motsvarande sätt "${FIL%/*}" istället för `dirname "$FIL"`.
Nä.
Nu var det där mest tänkt som ett exempel på hur ${VAR#pattern} och ${VAR%pattern} fungerar ;)

Det bygger på en mycket enkelt regel... allt innan sista / är katalognamnet och allt efter sista / är filnamnet, vilket givetvis förutsätter att innehållet i $FIL faktiskt ser ut på ett visst sätt. Det måste till att börja med finnas minst ett / för att regeln "innan och efter sista /" ens ska vara meningsfull. Sedan havererar det även för sökvägar som inte har någonting "innan sista /" (absolut sökväg till fil direkt i root-katalogen) eller "efter sista /" (vilket du redan påpekat).

Vi kan ju ta det som en fördjupad övning i parameterexpansion att anpassa $FIL så att den garanterat (förutsatt att $FIL inte är tom) innehåller ett sista / som varken är först eller sist:

Kod: Markera allt

FIL="${FIL%${FIL#/}}.${FIL:+/}${FIL%${FIL##*[^/]}}"
Användarvisningsbild
AntonPetts
Inlägg: 316
Blev medlem: 27 apr 2008, 23:01
OS: Arch Linux
Ort: Kalmar
Kontakt:

Re: Problem med skript

Inlägg av AntonPetts »

Kod: Markera allt

echo ${prevar%$color} >> "./${name}${tpostfix}/${name}"
vad är felet? :P
Mina teman: iod Suite, SimplyGrey
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Problem med skript

Inlägg av Konservburk »

AntonPetts skrev:

Kod: Markera allt

echo ${prevar%$color} >> "./${name}${tpostfix}/${name}"
vad är felet? :P
Svårt att svara på utan att veta vad alla variablerna har för värden.
Användarvisningsbild
AntonPetts
Inlägg: 316
Blev medlem: 27 apr 2008, 23:01
OS: Arch Linux
Ort: Kalmar
Kontakt:

Re: Problem med skript

Inlägg av AntonPetts »

Konservburk skrev:
AntonPetts skrev:

Kod: Markera allt

echo ${prevar%$color} >> "./${name}${tpostfix}/${name}"
vad är felet? :P
Svårt att svara på utan att veta vad alla variablerna har för värden.
$prevar = massa xml-kod
$color = en rgbfärg, i det här fallet ffd600
$name = "test"
$tpostfix = "smileys"

Den skriver alltså ut hela $prevar, och inte bara fram till ffd600. Måste väl bero på något tecken i xml:en? hur ska jag escapa det? :)

edit, det är förresten ungefär så här det ska se ut när det är klart :P

Kod: Markera allt

echo "pre='${prevar%1;fill:#$color}'" >> "./${name}${tpostfix}/${name}"
Mina teman: iod Suite, SimplyGrey
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Problem med skript

Inlägg av Konservburk »

AntonPetts skrev:Den skriver alltså ut hela $prevar, och inte bara fram till ffd600. Måste väl bero på något tecken i xml:en? hur ska jag escapa det? :)
Det kan jag knappast tänka mig. Är ffd600 verkligen det absolut sista i $prevar?
Användarvisningsbild
AntonPetts
Inlägg: 316
Blev medlem: 27 apr 2008, 23:01
OS: Arch Linux
Ort: Kalmar
Kontakt:

Re: Problem med skript

Inlägg av AntonPetts »

Konservburk skrev:
AntonPetts skrev:Den skriver alltså ut hela $prevar, och inte bara fram till ffd600. Måste väl bero på något tecken i xml:en? hur ska jag escapa det? :)
Det kan jag knappast tänka mig. Är ffd600 verkligen det absolut sista i $prevar?
Jaha, nu fattar jag! ;D
jag sätter alltså dit en "*" i slutet
Mina teman: iod Suite, SimplyGrey
Skriv svar

Återgå till "Programmering och webbdesign"