Hallo, ich habe folgendes Problem: Hat man geschrieben #! /bin/sh VAR="A B C D E F" for param in $VAR ; do echo $param done dann wird param vor jedem Schleifendurchlauf mit einem neuen Element aus der Liste in VAR gesetzt - soweit das übliche. Wie kann ich erreichen, daß man zugleich gleich mehrere Parameter gleichzeitig vor jedem Schleifendurchlauf gesetzt bekommt? Oder zumindest innerhalb der Schleife, bevor anderweitige Teile ausgeführt werden. Also sowas, wie #! /bin/sh VAR="A B C D E F" NUM="0 1 2 3 4 5" TXT="Z Y X W V U" for (param_v in $VAR && param_n in $NUM && param_t in $TXT) ; do echo $param_v $param_n $param_t done Daß es so nicht funktioniert, ist klar, aber ich denke man versteht, was ich meine: Gibt es eine Möglichkeit hierfür, um das mit der bash ähnlich elegant zu formulieren? Danke schon im voraus für Eure Vorschläge! Gruß, Thomas
Am Samstag, 26. April 2003 13:59 schrieb Thomas Michalka:
Also sowas, wie
#! /bin/sh
VAR="A B C D E F" NUM="0 1 2 3 4 5" TXT="Z Y X W V U"
for (param_v in $VAR && param_n in $NUM && param_t in $TXT) ; do echo $param_v $param_n $param_t done
Also wenn die Werte zusammengehören und Du die auch in eine Variable legen kannst, tuts vielleicht ein: VAR="A|0|Z B|1|Y C|2|X D|3|W E|4|V F|5|U" for param in $VAR ; do parm_v=`echo $param | awk -F \| '{print $1}'` parm_n=`echo $param | awk -F \| '{print $2}'` parm_t=`echo $param | awk -F \| '{print $3}'` echo $param_v $param_n $param_tdone
Daß es so nicht funktioniert, ist klar, aber ich denke man versteht, was ich meine: Gibt es eine Möglichkeit hierfür, um das mit der bash ähnlich elegant zu formulieren?
Danke schon im voraus für Eure Vorschläge!
Gruß, Thomas
-- Machs gut | http://www.iivs.de/schwinde/buerger/tremmel/ | http://packman.links2linux.de/ Manfred | http://www.knightsoft-net.de
Sorry, 2. Versuch, die erste Mail war noch nicht fertig ... Am Samstag, 26. April 2003 13:59 schrieb Thomas Michalka:
Also sowas, wie
#! /bin/sh
VAR="A B C D E F" NUM="0 1 2 3 4 5" TXT="Z Y X W V U"
for (param_v in $VAR && param_n in $NUM && param_t in $TXT) ; do echo $param_v $param_n $param_t done
Also wenn die Werte zusammengehören und Du die auch in eine Variable legen kannst, tuts vielleicht ein: VAR="A|0|Z B|1|Y C|2|X D|3|W E|4|V F|5|U" for param in $VAR ; do parm_v=`echo $param | awk -F \| '{print $1}'` parm_n=`echo $param | awk -F \| '{print $2}'` parm_t=`echo $param | awk -F \| '{print $3}'` echo $param_v $param_n $param_t done Sowas ähnliches hab ich in meine xine-skin build-Script gebastelt. -- Machs gut | http://www.iivs.de/schwinde/buerger/tremmel/ | http://packman.links2linux.de/ Manfred | http://www.knightsoft-net.de
Hallo, erstmal herzlichen Dank an alle für die prompten Vorschläge! Deiner war IMHO der eleganteste und gleichzeitig der am besten geeignete. Manfred Tremmel schrieb:
Sorry, 2. Versuch, die erste Mail war noch nicht fertig ...
Am Samstag, 26. April 2003 13:59 schrieb Thomas Michalka:
[...] Also wenn die Werte zusammengehören und Du die auch in eine Variable legen kannst, tuts vielleicht ein:
VAR="A|0|Z B|1|Y C|2|X D|3|W E|4|V F|5|U"
for param in $VAR ; do parm_v=`echo $param | awk -F \| '{print $1}'` parm_n=`echo $param | awk -F \| '{print $2}'` parm_t=`echo $param | awk -F \| '{print $3}'` echo $param_v $param_n $param_t done
Es tut! Die Werte gehören in der Tat zusammen. Deswegen ist Deine Idee echt elegant und funktioniert. Die Vorschläge mit den verschachtelten for-Schleifen haben meine Bedürfnisse nicht getroffen (wäre ja auch nicht wirklich kompliziert gewesen, gell!), weil ich nicht jeden Parameter mit jedem anderen verheiraten wollte (das wären dann 5 * 5 * 5 = 125 Kombinationen). Der Vorschlag mit der VAR-Matrix (Henning Hucke), bei der die einzelnen Abschnitte extrahiert werden, und aus der wie aus einer Eingabedatei gelesen wird, ist auch nicht schlecht. Leider ist er nicht sehr flexibel, denn wenn man in den drei obigen Variablen die "druckenden" Zeichen in der Länge oder auch die Menge ändern will, dann muß man jedesmal auch die zweite und dritte Ziffer in allen Komponenten der Eingabematrix ändern. Ich gebe zu, daß ich meine Aufgabe (das meinte ich übrigens mit "Problem", das ich laut Henning Hucke angeblich nicht habe ;-) ) etwas vereinfacht formuliert habe, was aber der besseren Übersichtlichkeit geschuldet sein sollte. Hat ja auch zum Ziel geführt, net wahr! Ich habe eine Variation zu Deiner Lösung gefunden, die nicht auf einen Hilfs-String verzichten kann, aber dafür ohne die Vereinigung der verschiedenen Variablen auskommt. Für Leser, die - so wie ich - mit bash-scripting nicht so viel Erfahrung haben, noch ein Hinweis: Bei den awk-Aufrufen sind die einfachen Hochkommas WICHTIG, damit das erste $-Zeichen (gehört zum print-Statement von awk) nicht in der bash ausgewertet wird (nur '$position' soll hier von der bash interpretiert werden): awk '{print $'$position'}' # hier darf außer zw. 'print' und '$' KEIN Leerraum enthalten sein!!! Ich möchte Euch meine Lösung nicht vorenthalten, und ich lasse die Teile, die zeigen, wofür das ganze ist, drin, weil ich auch meiner Begeisterung für das Werkzeug RSync Ausdruck verleihen muß (SCNR, auch wenn's OT ist). Seht selbst: #! /bin/bash # Synchronises file systems on (different) hard disks. # Always completes a synchronisation before processing the next one. # Alter rsync options here! These are for my special purpose only. RSYNC_OPTS="-q -aWx \ --delete \ --exclude lost+found \ --exclude fstab \ --exclude fstab.curr" # Will contain a process id later PID_RSYNC="" PID_MOUNT="" # The mount point directory MP_DIR=/mnt # ------------------------------------------------------------------------ POS_NUM=" 1 2 3 4 5 6 7 8 9" # ------------------------------------------------------------------------ DEV_NUM=" 2 5 6 7 8 9 10 11 12" MPT_LST=" 02 05 06 07 08 09 10 11 12" SRC_LST=" /boot / /root /tmp /opt /usr /usr/local /var /home" NME_LST=" BOOT_FS ROOT_FS ADMIN_FS TMP_FS OPT_FS USR_FS USRLOCAL_FS VAR_FS HOME_FS" # Let's sync the filesystems now! for position in $POS_NUM ; do devnum=$(echo -n $DEV_NUM | awk '{print $'$position'}') mpoint=$(echo -n $MPT_LST | awk '{print $'$position'}') source=$(echo -n $SRC_LST | awk '{print $'$position'}') fsname=$(echo -n $NME_LST | awk '{print $'$position'}') # Is the file system already mounted? if [ 0 -eq $(mount | grep -c "\/dev\/hdb$devnum") ] ; then mount /dev/hdb$devnum $MP_DIR/$mpoint & PID_MOUNT=$! wait $PID_MOUNT 2> /dev/null fi # RSync doesn't need a trailing '/' when syncing the root file system if [ "$source" = "/" ] ; then source="" fi echo -en "$(date +'%T'): Copying files in $fsname from $source/ to $MP_DIR/$mpoint/ ... " # The '/' after 'source' ist MOST important to not copy # the mount point directory itself but its contents (see 'man (1) rsync')! rsync $RSYNC_OPTS $source/ $MP_DIR/$mpoint/ & PID_RSYNC=$! wait $PID_RSYNC 2> /dev/null ; echo "done (process $PID_RSYNC)." umount /dev/hdb$devnum done Was hier nicht so herauskommt ist, daß RSync einen wahrhaft fantastischen Job tut, denn es kopiert (beim erstem Mal schon) Dateisysteme eben nicht einfach so, sondern es ermittelt anhand von Prüfsummen, dem Zeitstempel und der Dateigröße, ob eine Datei überhaupt transferiert werden soll. Das macht es besonders für die Datensicherung über schmalbandige Netzwerkverbindungen (z.B. ISDN) interessant. Eine Vielzahl anderer Optionen machen es auch hochflexibel (siehe 'man (1) rsync') An dem Skript finde ich jetzt gut, daß man es auch sehr flexibel einsetzen kann - man braucht m.E. nur noch an den Listenparametern ändern und kann die Schleife weitgehend in Ruhe lassen. Ich hoffe Ihr habt auch soviel Freude damit (bash-scripting und RSync), wie ich. Denn: "Ich liebe es, wenn etwas funktioniert!" (Frei nach der Fernsehserie "Das A-Team". Hier heißt es "ein Plan" anstatt "etwas".) Schöne Grüße Thomas Michalka
Hallo, On Sun, 27 Apr 2003, Thomas Michalka wrote: [..]
------------------------------------------------------------------------ POS_NUM=" 1 2 3 4 5 6 7 8 9" # ------------------------------------------------------------------------ DEV_NUM=" 2 5 6 7 8 9 10 11 12" MPT_LST=" 02 05 06 07 08 09 10 11 12" SRC_LST=" /boot / /root /tmp /opt /usr /usr/local /var /home" NME_LST=" BOOT_FS ROOT_FS ADMIN_FS TMP_FS OPT_FS USR_FS USRLOCAL_FS VAR_FS HOME_FS"
# Let's sync the filesystems now! for position in $POS_NUM ; do
devnum=$(echo -n $DEV_NUM | awk '{print $'$position'}') mpoint=$(echo -n $MPT_LST | awk '{print $'$position'}') source=$(echo -n $SRC_LST | awk '{print $'$position'}') fsname=$(echo -n $NME_LST | awk '{print $'$position'}')
IMO willst du hier mit Arrays[1] arbeiten und diese ueber Indizes ansprechen. Denn praktisch emulierst du das ueber obiges. Guckst du hier: ==== #!/bin/bash DEV_NUM=( 2 5 6 7 8 9 \ 10 11 12) SRC_LST=("/boot" "/" "/root" "/tmp" "/opt" "/usr" \ "/usr/local" "/var" "/home") NME_LST=("BOOT_FS" "ROOT_FS" "ADMIN_FS" "TMP_FS" "OPT_FS" "USR_FS" \ "USRLOCAL_FS" "VAR_FS" "HOME_FS") i=0 while test -n "`echo \"${SRC_LST[$i]}\"`" do MPT="`printf '%02i' \"${DEV_NUM[$i]}\"`" echo "${DEV_NUM[$i]} ${MPT} ${SRC_LST[$i]} ${NME_LST[$i]}" devnum="${DEV_NUM[$i]}" mpoint="${MPT}" source="${SRC_LST[$i]}" fsname="${NME_LST[$i]}" echo "$devnum $mpoint $source $fsname" i=$[i+1] done ==== Ob du nun die Variablen extra setzt (devnum etc.) oder direkt auf die Arrays zugreifst ('${DEV_NUM[$i]}') ist mehr oder weniger egal... Ggfs. solltest du die Array-Variablen anders nennen. Achso: siehe man -P 'less +/\ \ Arrays' bash -dnh [1] gehen mit der bash -- ob und wie die mit anderen shells gehen weiss ich nicht. -- Hallihallohallöle. Sind Sie ein Troll? Kommen Sie zur dag°. Da werden Sie geholfen.
Thomas Michalka wrote:
Also sowas, wie
#! /bin/sh
VAR="A B C D E F" NUM="0 1 2 3 4 5" TXT="Z Y X W V U"
for (param_v in $VAR && param_n in $NUM && param_t in $TXT) ; do echo $param_v $param_n $param_t done
meinst du sowas? ,----| |#! /bin/sh | | VAR="A B C D E F" | NUM="0 1 2 3 4 5" | TXT="Z Y X W V U" | | for param_v in $VAR; do | »·······for param_n in $NUM; do | »·······»·······for param_t in $TXT; do | echo "$param_v" "$param_n" "$param_t" | done | »·······done | »·······»·······done `----| micha
*** Thomas Michalka (Thomas.Michalka@gmx.de) schrieb in suse-linux heute:
Hallo,
ich habe folgendes Problem:
Du hast kein Problem. Du hast nicht _gelesen_! Nimm von unterem, was Du tatsächlich brauchst. Wenn es das nicht trifft, mußt Du mit einer genaueren Beschreibund Deines Problems aufwarten. --- schnipp #!/bin/bash echo "--- Method 1" VAR1="A B C D E F" VAR2="0 1 2 3 4 5" VAR3="Z Y X W V U" for para1 in $VAR1; do for para2 in $VAR2; do for para3 in $VAR3; do echo "para1: $para1, para2: $para2, para3: $para3" done done done echo "--- Method 2" while read para1 para2 para3; do echo "para1: $para1, para2: $para2, para3: $para3" done <<-EOF ${VAR1:0:1} ${VAR2:0:1} ${VAR3:0:1} ${VAR1:2:1} ${VAR2:2:1} ${VAR3:2:1} ${VAR1:4:1} ${VAR2:4:1} ${VAR3:4:1} ${VAR1:6:1} ${VAR2:6:1} ${VAR3:6:1} ${VAR1:8:1} ${VAR2:8:1} ${VAR3:8:1} ${VAR1:10:1} ${VAR2:10:1} ${VAR3:10:1} EOF --- schnapp MG Henning Hucke -- "Frueher bin ich meistens davon ausgegangen, dass die Menschen vernueftig und intelligent sind... und habe die Welt nicht verstanden. Seitdem ich nurnoch davon ausgehe, dass sie vernunft_begabt_ und _potentiell_ intelligent sind, verstehe ich die Welt besser." (c) H. Hucke
participants (5)
-
David Haller
-
Henning Hucke
-
Manfred Tremmel
-
Michael Meyer
-
Thomas Michalka