Sida 1 av 2
Problem med skript
Postat: 21 dec 2008, 15:53
av AntonPetts
Jag håller på med ett bash-skript, men har kört fast lite

.
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?
Re: Problem med skript
Postat: 21 dec 2008, 16:15
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
Re: Problem med skript
Postat: 21 dec 2008, 16:21
av AntonPetts
haha, ja så lätt var det
Någon som vet hur man lägger till flaggor i ett skript?
Re: Problem med skript
Postat: 21 dec 2008, 17:23
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
Re: Problem med skript
Postat: 21 dec 2008, 18:15
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
just nu vill jag ha 4 flaggor med argument och 3 utan

Re: Problem med skript
Postat: 21 dec 2008, 18:25
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
Re: Problem med skript
Postat: 21 dec 2008, 19:04
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

Re: Problem med skript
Postat: 21 dec 2008, 19:47
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.
Re: Problem med skript
Postat: 21 dec 2008, 19:53
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 
Re: Problem med skript
Postat: 21 dec 2008, 20:13
av Konservburk
AntonPetts skrev:Om någon vill kolla på skriptet som det ser ut nu:
länk 
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
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.
Re: Problem med skript
Postat: 21 dec 2008, 20:24
av AntonPetts
Konservburk skrev:[Vad har du för kass tidsinställning egentligen?
XD
Ska fixa det direkt
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

Re: Problem med skript
Postat: 22 dec 2008, 04:14
av AntonPetts
En sak till!
Jag skulle behöva sätta en variabel till en del av en fil
Ungefär så här:
Borde väl gå att få till med
sed? eller finns det något bättre sätt?

Re: Problem med skript
Postat: 22 dec 2008, 07:24
av Konservburk
Det portabla sättet:
Kod: Markera allt
$ VAR=potatisskalare
$ echo ${VAR%are}
potatisskal
Det går att matcha med * också:
Använd två %% för att den ska gå på den längsta möjliga matchningen istället för den kortaste:
För att plocka bort början istället för slutet så använder du # istället för %:
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"`.
Re: Problem med skript
Postat: 22 dec 2008, 09:48
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.
Re: Problem med skript
Postat: 22 dec 2008, 14:59
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##*[^/]}}"
Re: Problem med skript
Postat: 22 dec 2008, 23:56
av AntonPetts
Kod: Markera allt
echo ${prevar%$color} >> "./${name}${tpostfix}/${name}"
vad är felet?

Re: Problem med skript
Postat: 23 dec 2008, 00:20
av Konservburk
AntonPetts skrev:Kod: Markera allt
echo ${prevar%$color} >> "./${name}${tpostfix}/${name}"
vad är felet?

Svårt att svara på utan att veta vad alla variablerna har för värden.
Re: Problem med skript
Postat: 23 dec 2008, 00:31
av AntonPetts
Konservburk skrev:AntonPetts skrev:Kod: Markera allt
echo ${prevar%$color} >> "./${name}${tpostfix}/${name}"
vad är felet?

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
Kod: Markera allt
echo "pre='${prevar%1;fill:#$color}'" >> "./${name}${tpostfix}/${name}"
Re: Problem med skript
Postat: 23 dec 2008, 01:22
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?
Re: Problem med skript
Postat: 23 dec 2008, 01:28
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!
jag sätter alltså dit en "*" i slutet