|
| 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 ] --
| |
|
|