Hallo,
ich versuche in einem Shellskript (bash) grad die Zuweisung:
A=$1 B=$2 C=$3
in einer Schleife zu verarbeiten:
for VARNAME in A B C; do ${VARNAME}=$1 shift done
${VARNAME} geht an dieser Stelle natürlich nicht.
Ich komm aber nach stundenlangem suchen, grübeln und probieren nicht auf das passende Konstrukt. Vermutlich seh ich mal wieder den Wald vor lauter Bäumen nicht. Kann mal jemand den Baum fällen, der mir da grad im Weg steht?
Danke.
Gruß Rico
Am 14.01.2012 23:01, schrieb Fabian Hänsel:
On 01/14/2012 10:50 PM, Rico Koerner wrote:
Hallo,
ich versuche in einem Shellskript (bash) grad die Zuweisung:
A=$1 B=$2 C=$3
in einer Schleife zu verarbeiten:
for VARNAME in A B C; do
eval ${VARNAME}=$1
Das ist es leider auch nicht, ich hab auch schon diverse Versuche mit eval und/oder '' bzw. "" durch, ich bekomme immer den Fehler:
Zeile 9: xyz: Kommando nicht gefunden.
'xyz' war an dieser Stelle der Inhalt von $1
Je nachdem wie das Quoting gesetzt wird kommt auch mal:
Zeile 9: A=xyz: Kommando nicht gefunden.
Gruß Rico
Am Sonntag, den 15.01.2012, 10:49 +0100 schrieb Rico Koerner:
Am 14.01.2012 23:01, schrieb Fabian Hänsel:
On 01/14/2012 10:50 PM, Rico Koerner wrote:
Hallo,
ich versuche in einem Shellskript (bash) grad die Zuweisung:
A=$1 B=$2 C=$3
in einer Schleife zu verarbeiten:
for VARNAME in A B C; do
eval ${VARNAME}=$1
Das ist es leider auch nicht, ich hab auch schon diverse Versuche mit eval und/oder '' bzw. "" durch, ich bekomme immer den Fehler:
Zeile 9: xyz: Kommando nicht gefunden.
'xyz' war an dieser Stelle der Inhalt von $1
Je nachdem wie das Quoting gesetzt wird kommt auch mal:
Zeile 9: A=xyz: Kommando nicht gefunden.
Hallo,
ich habe auch mal etwas probiert. Bei mir funktioniert folgendes:
#!/bin/bash for VARNAME in A B C; do eval ${VARNAME}=$1 echo -n "$VARNAME = " eval echo ${!VARNAME} shift done
Vielleicht liegt die Ursache der Fehlermeldung noch woanders.
Viele Grüße Frank
Am 15.01.2012 13:03, schrieb Frank Hasterok:
Hallo,
ich habe auch mal etwas probiert. Bei mir funktioniert folgendes:
#!/bin/bash for VARNAME in A B C; do eval ${VARNAME}=$1 echo -n "$VARNAME = " eval echo ${!VARNAME} shift done
Tut es bei mir auch. Manchmal muß man wahrscheinlich nur eine Nacht drüber schlafen. Alles überflüssige wieder entfernt und dann gings auch an der ersten Stelle, blieb nur noch das Problem beim anfügen, das nun mit dem Quoting des Leerzeichens gelöst werden konnte. Bisher hatte ich das Problem an der Variableninterpolation gesucht.
eval ${OPTVAR}="${!OPTVAR}\ $1"
Vorher fehlte der .
Vielleicht liegt die Ursache der Fehlermeldung noch woanders.
Schon bei eval, aber eben beim Leerzeichen. Warum es aber bei dem einfachen eval auch klemmte, kann ich jetzt nicht mehr nachvollziehen.
Rico
On 01/15/2012 10:49 AM, Rico Koerner wrote:
Am 14.01.2012 23:01, schrieb Fabian Hänsel:
On 01/14/2012 10:50 PM, Rico Koerner wrote:
Hallo,
ich versuche in einem Shellskript (bash) grad die Zuweisung:
A=$1 B=$2 C=$3
in einer Schleife zu verarbeiten:
for VARNAME in A B C; do
eval ${VARNAME}=$1
Das ist es leider auch nicht, ich hab auch schon diverse Versuche mit
$ ziel="a" $ a=100 $ eval $ziel=200 $ echo $a 200 $ bash --version GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Viele Grüße Fabian
Rico Koerner rico@netbreaker.de (Sa 14 Jan 2012 22:50:04 CET):
Hallo,
ich versuche in einem Shellskript (bash) grad die Zuweisung:
A=$1 B=$2 C=$3
in einer Schleife zu verarbeiten:
for VARNAME in A B C; do ${VARNAME}=$1 shift done
${VARNAME} geht an dieser Stelle natürlich nicht.
Vielleicht so:
#! /bin/bash
A="$1"; shift B="$1"; shift C="$1"; shift
for VARNAME in A B C; do declare ${!VARNAME}="$value" done
Am 15.01.2012 21:10, schrieb Heiko Schlittermann:
Vielleicht so:
#! /bin/bash
A="$1"; shift B="$1"; shift C="$1"; shift
for VARNAME in A B C; do declare ${!VARNAME}="$value" done
Soweit wollte ich nicht gehen, daß die übergebenen Parameter zu Variablennamen werden, ist aber auch interessant.
Ich war auf der Suche nach einer besseren Lösung für getopts, da dort (zumindest aus meiner Sicht) ein paar Fehler drin stecken.
while getopts a:b:c option ...
getopts.sh -a Max Muster -b Musterstadt Hier wird Muster verschluckt, was noch halbwegs verständlich ist.
getopts.sh -a -b Musterstadt Hier wird '-b' als Parameter von -a verstanden und -b existiert dann nicht mehr als Option. Das finde ich nicht mehr ganz so sinnvoll.
Mein Ansatz hat sicher auch noch Schwächen, löst aber die beiden Probleme. Mal sehen, wann ich auf andere Probleme stoße.
#!/bin/bash
OPTVAR="REST"
while [ $# -gt 0 ]; do if [ "$1" == "${1#-*}" ]; then echo "Param: $1 >> ${OPTVAR}" if [ -n "${!OPTVAR}" ]; then eval "${OPTVAR}=${!OPTVAR}\ $1" else eval ${OPTVAR}="$1" fi shift else echo "option: $1" case "$1" in -a) OPTVAR="A" ;; -b) OPTVAR="B" ;; -c) C="TRUE" OPTVAR="REST" ;; -? | --help) echo "HELP" exit ;; esac shift fi done
for OPTVAR in A B REST; do echo "${OPTVAR}: ${!OPTVAR}" done
Rico
Rico Koerner rico@netbreaker.de (Mo 16 Jan 2012 17:31:00 CET):
Soweit wollte ich nicht gehen, daß die übergebenen Parameter zu Variablennamen werden, ist aber auch interessant.
Ich war auf der Suche nach einer besseren Lösung für getopts, da dort (zumindest aus meiner Sicht) ein paar Fehler drin stecken.
/usr/bin/getopt gefällt Dir nicht?
Am 16.01.2012 23:52, schrieb Heiko Schlittermann:
/usr/bin/getopt gefällt Dir nicht?
sah mir auf den ersten Blick etwas unübersichtlich aus, werd mich damit auch noch auseinandersetzen. Außerdem war mal wieder etwas Fingerübung in der bash notwendig und ich brauchte was zum zeigen für unseren Praktikanten. ;-)
Gruß Rico
Rico Koerner rico@netbreaker.de (Mo 16 Jan 2012 17:31:00 CET):
Am 15.01.2012 21:10, schrieb Heiko Schlittermann:
Vielleicht so:
#! /bin/bash
A="$1"; shift B="$1"; shift C="$1"; shift
for VARNAME in A B C; do declare ${!VARNAME}="$value" done
Soweit wollte ich nicht gehen, daß die übergebenen Parameter zu Variablennamen werden, ist aber auch interessant.
Ich war auf der Suche nach einer besseren Lösung für getopts, da dort (zumindest aus meiner Sicht) ein paar Fehler drin stecken.
while getopts a:b:c option ...
getopts.sh -a Max Muster -b Musterstadt Hier wird Muster verschluckt, was noch halbwegs verständlich ist.
getopts.sh -a -b Musterstadt Hier wird '-b' als Parameter von -a verstanden und -b existiert dann nicht mehr als Option. Das finde ich nicht mehr ganz so sinnvoll.
Es ist das dokumentierte Verhalten von getopts. Woher soll es wissen, daß „-b“ nicht der erwartete Parameter zu „-a“ ist?
Ein anderes Verhalten legt getopt(1) an den Tag.
./x -a -b hallo ./x -a knix -b knax ./x -aknix -b knax
---- #! /bin/bash
# parameter to -a is optional, -b and -c require a parameter tmp=$(getopt --name $0 --options a::b:c: -- "$@") || exit eval set -- "$tmp"
while :; do opt="$1"; shift case "$opt" in -a) echo "option a: <$1>";; -b) echo "option b: <$1>";; --) break;; esac done
echo "rest: $@" ------
Am 17.01.2012 11:50, schrieb Heiko Schlittermann:
Rico Koerner rico@netbreaker.de (Mo 16 Jan 2012 17:31:00 CET):
Ich war auf der Suche nach einer besseren Lösung für getopts, da dort (zumindest aus meiner Sicht) ein paar Fehler drin stecken.
Es ist das dokumentierte Verhalten von getopts. Woher soll es wissen, daß „-b“ nicht der erwartete Parameter zu „-a“ ist?
Es könnte es daran erkennen, daß ein "-" am Anfang steht. Dann kommt natürlich die Frage auf; was passiert wenn mein Parameter mit einem "-" beginnt. Sonderfälle gibt es immer, Fehler war da vielleicht der falsche Begriff. Dokumentiert ist die eine Seite, was man erwartet (intuitive Bedienung) die andere Seite.
Gruß Rico
lug-dd@mailman.schlittermann.de