PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : tcsh foreach zeilenweise



DanielDD
26-07-2012, 14:19
Hallo Leute,

ich habe ein tcsh-script mit folgender foreach-Schleife:


foreach zeile (`cat file.txt`)
.....
end


Es funktioniert nicht so, wie ich will.
Die Variable zeile wird mit allen Worten der Datei file.txt belegt.
Ich möchte jedoch, dass zeile mit jeder Zeile der Datei file.txt
belegt wird, d.h. der Block innerhalb der Schleife soll für jede Zeile
aus file.txt ausgeführt werden. Wie erreiche ich das am einfachsten
in tcsh?

Daniel

undefined
30-07-2012, 05:27
Unter tcsh ist es nicht so einfach den IFS (BASH) zu ändern!
Es gibt verschiedene eigen Kreationen im Netz die dir Helfen können oder selbst bauen.


#!/usr/bin/tcsh -f

foreach zeile (`cat test.txt | sed 's, ,\\t,g'`)
echo $zeile
end


Für die Kompatibilität siehe: http://interglacial.com/~sburke/pub/shell_equivalencies.txt

Mit bash kann man so etwas wesentlich besser machen.
Beispiel:


#!/usr/bin/env bash
#################################
## Generiert eine neue /etc/ftpusers
## echo "$IFS" | od -c
## echo "$IFS" | od -b
#################################

cat > /tmp/ftpusers <<EOF
#
# ftpusers This file describes the names of the users that may
# _*NOT*_ log into the system via the FTP server.
# This usually includes "root", "uucp", "news" and the
# like, because those users have too much power to be
# allowed to do "just" FTP...
#
EOF

IFS=":"
while { read user d d gid d; }; do
if [ $gid -le 999 -a "$user" != "ftp" ]; then
echo "$user"
fi
done </etc/passwd >>/tmp/ftpusers

cat >> /tmp/ftpusers <<EOF
##EOF

EOF