Variabler/array - scoop inom samma script? [LÖST]

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Variabler/array - scoop inom samma script? [LÖST]

Inlägg av Majo »

Jag får inte nedanstående script att fungera. Scriptet ska scanna igenom en rad mappar efter diverse filtyper och först skriva ut antalet filer av respektive typ för varje mapp och sedan skriva ut det totala antalet av varje filtyp. Allt fungerar förutom att variablerna i arrayen som ska summeras inte får några värden och därför inte skrivs ut. Har jag missat något om arrayer eller vad gör jag för fel? Har testat typ alla tänkbara kombinationer av måsvingar/inte måsvingar/citattecken/inte citattecken/osv kring alla variabler. Scriptet är här förkortat/förenklat/rensat för att bespara er onödig kod.

Kod: Markera allt

#!/bin/bash
export PATH=$PATH:/bin/:/usr/bin:/usr/local/bin
# Sökväg till rapportfil
RAPPORTFIL=/Users/jag/Desktop/test/rapport.txt
#Loopar igenom alla mappar i min hemmakatalog
for FOLD in $(ls /Users/jag)
do
#Sökväg till respektive mapp
FOLDPATH=/Users/jag/$FOLD
#Kollar att det är en mapp
if [ -d $FOLDPATH ] ; then
#Skriver ut storleken på mappen 
echo \($FOLD\) är totalt $(du -sh $FOLDPATH)  >> $RAPPORTFIL
#Nollställer räknare för varje varv i for-loopen
let COUNTER=0
#Sökväg till textfil som innehåller en lista på filtyper jag vill räkna i mapparna
FILTYPER="/Users/jag/Desktop/test/filtyper"
cat ${FILTYPER} | \
#Loopar igenom listan av filtyper och räknar antalet av varje typ i mapparna
while
read FILTYP; do
FILTYPJOKER="*."${FILTYP}
PART2=`find ${FOLDPATH} -iname ${FILTYPJOKER} | wc -l`
#Om det hittas några filer av respektive filtyp skrivs resultatet ut
if [ $PART2 -gt 0 ]; then
PART1="${FOLD} innehåller"
PART3="${FILTYP} i mappen"
echo $PART1 $PART2 $PART3 >>$RAPPORTFIL
#För varje varv i while-loopen adderas antalet filer av en typ till en variabel i en array
let ANTAL[$COUNTER]=${ANTAL[$COUNTER]}+$PART2
let COUNTER=${COUNTER}+1
fi
done
fi
done
#Antalet filer av respektive typ har summerats och ska skrivas ut
echo TOTALT UDDA FILTYPER >> $RAPPORTFIL
let COUNTER=0
#Använder textfilen med filtyper igen för att lopa igenom arrayen och skriva ut summorna
cat ${FILTYPER} | \
while
read FILTYP; do
echo Totalt ${ANTAL[$COUNTER]} ${FILTYP} >> $RAPPORTFIL
let COUNTER=${COUNTER}+1
done
Senast redigerad av 2 Majo, redigerad totalt 26 gång.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Variabler/array - scoop inom samma script?

Inlägg av Konservburk »

Majo skrev:Allt fungerar förutom att variablerna i arrayen som ska summeras inte får några värden och därför inte skrivs ut. Har jag missat något om arrayer eller vad gör jag för fel?
När du använder konstruktionen cat fil | while read; do ... done så blir variablerna inne i while-loopen lokala för just den loopen. Det går att undvika om du istället använder while read; do ... done <fil.
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Variabler/array - scoop inom samma script?

Inlägg av Majo »

Konservburk skrev:
Majo skrev:Allt fungerar förutom att variablerna i arrayen som ska summeras inte får några värden och därför inte skrivs ut. Har jag missat något om arrayer eller vad gör jag för fel?
När du använder konstruktionen cat fil | while read; do ... done så blir variablerna inne i while-loopen lokala för just den loopen. Det går att undvika om du istället använder while read; do ... done <fil.
Fungerar klockrent. Jag misstänkte nånting liknande men trots en massa googlande och en hel del bläddrande i böcker hittade jag inte exakt vad det handlade om.

Tusen tack!!!
Skriv svar

Återgå till "Terminalforum"