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