Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 20.05.2006 15:24:46
Hallo,
ich habe ein Script, in dem eigentlich nur ein find ausgeführt wird.
Code: Alles auswählen
maxUsage=10
logfile="loghogs.$$"
dirs="/home"
uidStart=99
trap "/bin/rm -f $logfile" EXIT
for name in `cut -d: -f1,3 /etc/passwd | awk -F: '$2 > $uidStart { print $1 }'`
do
echo -n "$name "
find $dirs -user $name -xdev -type f -ls | awk '{ sum += $7 } END { print sum / (1024*1024) }'
done | awk "\$2 > $maxUsage { print \$0 }" > $logfile
Wenn ich das Script wie oben beschrieben aufrufe, findet er nichts. Wenn ich aber die Variable $uidStart durch eine Zahl wie 99 ersetze, bekomme ich das richtige Ergebnis zurück.
Wieso wird in dem Script die Variable $uidStart nicht angenommen?
Oh, yeah!
-
h-man
- Beiträge: 745
- Registriert: 05.02.2003 13:10:08
- Wohnort: Berlin
-
Kontaktdaten:
Beitrag
von h-man » 20.05.2006 15:31:33
in deinem skript hat die variable doch den wert 99.
wo trägst du denn noch 99 ein damit es bei dir läuft?
achte mal auf leerzeichen in variablen
![Smile :-)](./images/smilies/icon_smile.gif)
Nieder mit der Schwerkraft.
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 20.05.2006 15:35:13
Ja, ja.
Ich habe die Variabel uidStart auf 99 gesetzt. Doch sobald ich das Script ausführe, wird nichts gefunden. Wenn ich aber im Script die Variable $uidStart durch 99 ersetze, funktioniert das Script.
Sprich das Script sieht dann so aus:
Code: Alles auswählen
for name in `cut -d: -f1,3 /etc/passwd | awk -F: '$2 > 99 { print $1 }'`
do
echo -n "$name "
find $dirs -user $name -xdev -type f -ls | awk '{ sum += $7 } END { print sum / (1024*1024) }'
done | awk "\$2 > $maxUsage { print \$0 }" > $logfile
Oh, yeah!
-
Savar
- Beiträge: 7174
- Registriert: 30.07.2004 09:28:58
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Berlin
Beitrag
von Savar » 20.05.2006 15:36:48
Die Bash ersetzt innerhalb von ' ' (einfachen Anführungsstrichen) keine Variablen.. mach es so:
Code: Alles auswählen
maxUsage=10
logfile="loghogs.$$"
dirs="/home"
uidStart=99
trap "/bin/rm -f $logfile" EXIT
for name in `cut -d: -f1,3 /etc/passwd | awk -F: '$2 > '$uidStart' { print $1 }'`
do
echo -n "$name "
find $dirs -user $name -xdev -type f -ls | awk '{ sum += $7 } END { print sum / (1024*1024) }'
done | awk "\$2 > $maxUsage { print \$0 }" > $logfile
-
gms
- Beiträge: 7798
- Registriert: 26.11.2004 20:08:38
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von gms » 20.05.2006 15:37:46
man bash hat geschrieben:
Enclosing characters in single quotes preserves the literal value of
each character within the quotes.
dein $uidStart ist zwischen "single quotes" und wird daher nicht ersetzt
-
ToPeG
- Beiträge: 437
- Registriert: 14.04.2004 00:42:06
Beitrag
von ToPeG » 20.05.2006 15:39:21
So solltes es funktionieren:
Code: Alles auswählen
maxUsage=10
logfile="loghogs.$$"
dirs="/home"
uidStart=99
trap "/bin/rm -f $logfile" EXIT
for name in `cut -d: -f1,3 /etc/passwd | awk -F: "\$2 > $uidStart { print \$1 }"`
do
echo -n "$name "
find $dirs -user $name -xdev -type f -ls | awk '{ sum += $7 } END { print sum / (1024*1024) }'
done | awk "\$2 > $maxUsage { print \$0 }" > $logfile
ich habe die einfachen Anführungszeichen durch doppelte erstet und $1 und $2 zu "nicht Variablen" gemacht. Wie es in der letzen Zeile schon vorgemacht ist.
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 20.05.2006 15:44:24
Danke für die schnellen Antworten.
Es funktioniert nun auch. Habe es so gemacht.
Code: Alles auswählen
for name in `cut -d: -f1,3 /etc/passwd | awk -F: '$2 > '$uidStart' { print $1 }'`
do
echo -n "$name "
find $dirs -user $name -xdev -type f -ls | awk '{ sum += $7 } END { print sum / (1024*1024) }'
@ToPeG: Dein Vorschlag funktioniert leider nicht, da print von awk dann meckert.
Oh, yeah!
-
ToPeG
- Beiträge: 437
- Registriert: 14.04.2004 00:42:06
Beitrag
von ToPeG » 20.05.2006 16:18:19
Darum mag ich Shellprogrammierung nicht.
Man muß hier die "\" durch dopplete ersetzen allso:
Code: Alles auswählen
maxUsage=10
logfile="loghogs.$$"
dirs="/home"
uidStart=99
trap "/bin/rm -f $logfile" EXIT
for name in `cut -d: -f1,3 /etc/passwd | awk -F: "\\$2 > $uidStart { print \\$1 }"`
do
echo -n "$name "
find $dirs -user $name -xdev -type f -ls | awk '{ sum += $7 } END { print sum / (1024*1024) }'
done | awk "\$2 > $maxUsage { print \$0 }" > $logfile
Zuletzt geändert von
ToPeG am 20.05.2006 16:33:58, insgesamt 1-mal geändert.
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 20.05.2006 16:21:27
OK, so funktionierts.
Danke nochmal.
Das sind immer so die Sachen, die ich schnell übersehe.
Oh, yeah!