Moin,
zuerst mal vermisse ich in Deinem useradd den Benutzernamen. Wo steht denn der? Du übergibst ja nur einen Kommentar (-c) und eine GID (-g; das gleich doppelt). Ich nehme an, in "uid" und "gid" stehen dann numerische Werte? Wo kriegst Du die her? Oder sollen alle Benutzer die gleiche UID erhalten? Wäre keine so tolle Idee. Und "shell" wird dann wohl auch durch einen gültigen PFad zu einer real existierenden Shell ersetzt, oder?
Wieso setzt Du erst den Delimiter von \t auf : um, wenn Du anschließend awk benutzt? Der kann mit Tabs als Feldtrenner von Haus aus prima umgehen:
Code:
jan@jack:~/tmp> echo -e "1\t2\t3" | awk ' { print "1 =", $1, "2 =", $2, "3 =", $3 } '
1 = 1 2 = 2 3 = 3
Damit würde sich Deine Schleife auch gleich deutlich vereinfachen (nämlich verschwinden):
Code:
awk '{ printf "useradd -c %s -d -g %s -u uid -g gid -s shell\n", $1, $2; }' $1 | sh
Und es geht sogar ganz ohne awk, weil z. B. read auch direkt Daten aus einer Tab-getrennten Liste aufnehmen kann (die fehlenden Felder solltest Du noch ergänzen):
Code:
while read comm gid; do
useradd -c $comm -d -g $gid -u uid -g gid -s shell
done <$1
Der einzige Grund zum Umsetzen des Feldtrenners wäre IMHO, wenn der Kommentar Leerzeichen enthält (das dürfen dann natürlich nie Tabs sein). Dann ginge das so:
Code:
jan@jack:~/tmp> echo -e "1\t2\t3" | sed 's/\t/:/g'
1:2:3
jan@jack:~/tmp> echo -e "1\t2\t3" | sed 's/ /:/g'
1:2:3
Achtung: der Tab im 2. sed wird so erzeugt, dass nacheinander CTRL-v und TAB gedrückt werden. Wenn Du den Delimiter als Variable einsetzen willst, dann musst Du statt '' doppelte Anführungszeichen nehmen. Auch dann kannst Du übrigens mit einer einfachen read-Schleife arbeiten, Du setzt einfach vor der Schleife die Variable IFS auf den Doppelpunkt.
Jan
EDIT: Wenn der Kommentar Leerzeichen enthalten kann, dann muss das Argument für die -c-Option im useradd natürlich in "" oder '' eingeschlossen werden (oder jedes Leerzeichen durch einen \ entwertet werden ;-). Nur so als Ergänzung.
Lesezeichen