Variable wird im Script nicht angenommen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Variable wird im Script nicht angenommen

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!

Benutzeravatar
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.

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

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Re: Variable wird im Script nicht angenommen

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

MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

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

Re: Variable wird im Script nicht angenommen

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.

Benutzeravatar
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.

Code: Alles auswählen

awk:  > 99 { print  }
awk:  ^ syntax error
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.

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

Antworten