/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Bash script - funktionskald uden expand af~
Fra : Michael Jenner


Dato : 10-08-03 11:13

Jeg har en bash shell script-stump som jeg gerne vil have lagt over i en
funktion, desværre volder det lidt problemer.

Oprindelig script:

#!/bin/bash
FILEPATTERN="hejsa"
FILEEXT="txt"
FILEPATH="/sti/til/filer/"
CYCLEFILEMAX=9

CYCLEFILECOUNT=`ls -al -t ${FILEPATH}${FILEPATTERN}*${FILEEXT} | wc -l`
while [ $CYCLEFILECOUNT -gt $CYCLEFILEMAX ]
do
OLDFILE=`ls -t ${FILEPATH}${FILEPATTERN}*${FILEEXT} | tail -1`
# rm ${OLDFILE}
# if [ $? -neq 0 ]; then
# echo "Failed to delete ${OLDFILE}, exiting"
# exit 1
# fi
CYCLEFILECOUNT=`ls ${FILEPATH}${FILEPATTERN}*${FILEEXT} |wc -l`
echo "Deleting: ${OLDFILE}"
# Test only so drop out of loop:
CYCLEFILECOUNT=${CYCLEFILEMAX}
done

Første forsøg på at flytte det til funktion:

#!/bin/bash
FILEPATTERN="hejsa"
FILEEXT="txt"
FILEPATH="/afs/ies.auc.dk/user/mj/archive/teaching/templates/test/"
CYCLEFILEMAX=9

##############################
# rotatefile filename (* wildcards allowed)
##############################

rotatefile () {
CYCLEFILECOUNT=`ls -al -t $1 | wc -l`
echo $1
echo "${CYCLEFILECOUNT} and $CYCLEFILEMAX"
while [ $CYCLEFILECOUNT -gt $CYCLEFILEMAX ]
do
OLDFILE=`ls -t "$1" | tail -1`
# rm ${OLDFILE}
# if [ $? -neq 0 ]; then
# echo "Failed to delete ${OLDFILE}, exiting"
# exit 1
# fi
CYCLEFILECOUNT=`ls "$1" |wc -l`
echo "Deleting: ${OLDFILE}"
# Test only so drop out of loop
CYCLEFILECOUNT=${CYCLEFILEMAX}
done
}

rotatefile ${FILEPATH}${FILEPATTERN}*${FILEEXT}

Desværre fanger funktionen kun 1 match - echo $1 giver kun første match
- dvs. hejsa.txt. Den fanger ikke hejsa2.txt, hejsa3.txt osv - præcis
som om * ikke var der i kaldet af funktionen. Kalder jeg det oprindelige
script istedet finder den alle filer der matcher hejsa*txt.

Hvad gør jeg galt? Løsningsforslag?

På forhånd tak

Michael



 
 
Mogens Kjaer (10-08-2003)
Kommentar
Fra : Mogens Kjaer


Dato : 10-08-03 11:18

Michael Jenner wrote:
....
> Desværre fanger funktionen kun 1 match - echo $1 giver kun første match
> - dvs. hejsa.txt. Den fanger ikke hejsa2.txt, hejsa3.txt osv - præcis
> som om * ikke var der i kaldet af funktionen.
....

Mon ikke $2 bliver sat til hejsa2.txt, $3 til hejsa3.txt, etc. ?

Mogens


--
Mogens Kjaer, Carlsberg A/S, Computer Department
Gamle Carlsberg Vej 10, DK-2500 Valby, Denmark
Phone: +45 33 27 53 25, Fax: +45 33 27 47 08
Email: mk@crc.dk Homepage: http://www.crc.dk


Michael Jenner (10-08-2003)
Kommentar
Fra : Michael Jenner


Dato : 10-08-03 11:25

Mogens Kjaer wrote:
> Michael Jenner wrote:
> ...
>
>> Desværre fanger funktionen kun 1 match - echo $1 giver kun første
>> match - dvs. hejsa.txt. Den fanger ikke hejsa2.txt, hejsa3.txt osv -
>> præcis som om * ikke var der i kaldet af funktionen.
>
> ...
>
> Mon ikke $2 bliver sat til hejsa2.txt, $3 til hejsa3.txt, etc. ?

Jo, selvfølgelig! Hvordan undgår jeg at * expanderes?

Mvh Michael


Mogens Kjaer (10-08-2003)
Kommentar
Fra : Mogens Kjaer


Dato : 10-08-03 11:23

Michael Jenner wrote:
....
> Jo, selvfølgelig! Hvordan undgår jeg at * expanderes?
....

Kan du ikke bare lave dit script om, så det læser $2, $3, etc.

Mogens

--
Mogens Kjaer, Carlsberg A/S, Computer Department
Gamle Carlsberg Vej 10, DK-2500 Valby, Denmark
Phone: +45 33 27 53 25, Fax: +45 33 27 47 08
Email: mk@crc.dk Homepage: http://www.crc.dk


Michael Jenner (10-08-2003)
Kommentar
Fra : Michael Jenner


Dato : 10-08-03 11:56

Mogens Kjaer wrote:
> Michael Jenner wrote:
> ...
>
>> Jo, selvfølgelig! Hvordan undgår jeg at * expanderes?
>
> ...
>
> Kan du ikke bare lave dit script om, så det læser $2, $3, etc.

Hmmm ... måske men så skal det ændres radikalt. En løsning ser ud til at
være at splitte argumentet op i to - filnavn og extension:

#!/bin/bash
FILEPATTERN="hejsa"
FILEEXT="txt"
FILEPATH="/sti/til/filer/"
CYCLEFILEMAX=9

##############################
# rotatefile filename fileextension
##############################

rotatefile () {
CYCLEFILECOUNT=`ls -al -t ${1}*${2} | wc -l`
echo $1
echo "${CYCLEFILECOUNT} and $CYCLEFILEMAX"
while [ $CYCLEFILECOUNT -gt $CYCLEFILEMAX ]
do
OLDFILE=`ls -t ${1}*${2} | tail -1`
# rm ${OLDFILE}
# if [ $? -neq 0 ]; then
# echo "Failed to delete ${OLDFILE}, exiting"
# exit 1
# fi
CYCLEFILECOUNT=`ls ${1}*${2} |wc -l`
echo "Deleting: ${OLDFILE}"
# Test only so drop out of loop
CYCLEFILECOUNT=${CYCLEFILEMAX}
done
}

rotatefile ${FILEPATH}${FILEPATTERN} ${FILEEXT}



Rasmus Bøg Hansen (10-08-2003)
Kommentar
Fra : Rasmus Bøg Hansen


Dato : 10-08-03 11:29

Michael Jenner <mj@kom.auc.dk> writes:

> Mogens Kjaer wrote:
>> Michael Jenner wrote:
>> ...
>>
>>> Desværre fanger funktionen kun 1 match - echo $1 giver kun første
>>> match - dvs. hejsa.txt. Den fanger ikke hejsa2.txt, hejsa3.txt osv
>>> -
>>> præcis som om * ikke var der i kaldet af funktionen.
>> ...
>> Mon ikke $2 bliver sat til hejsa2.txt, $3 til hejsa3.txt, etc. ?
>
> Jo, selvfølgelig! Hvordan undgår jeg at * expanderes?

Ved at sætte " omkring - men så sender den parameteren i dens rå form
("hejsa*.txt").

Prøv i stedet at kigge på shift.

/Rasmus

--
-- [ Rasmus "Møffe" Bøg Hansen ] ---------------------------------------
Sleep is a poor substitue for enough caffeine.
----------------------------------[ moffe at amagerkollegiet dot dk ] --

Søg
Reklame
Statistik
Spørgsmål : 177505
Tips : 31968
Nyheder : 719565
Indlæg : 6408554
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste