Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[gentoo-user-de] OT: bash () bei variablen

1 view
Skip to first unread message

jens wefer

unread,
Jan 6, 2013, 8:30:02 PM1/6/13
to
hey,

ip_neu=`cat $TMPDIR/$TMPFILE | grep -Eo
'([0-9]{1,3}\.){3}[0-9]{1,3}'` laenge=${#untestedip}

damit hol ich ip's aus ner datei, da kommt dann einer oder auch meherer
getrennt mit space oder return.
ich will nur die erste, wenn mehr sind greif ich mir die erste als
substring.

klappt alles wie gewuenscht.

nun hab ich entdeckt das:
ip1=($ip_neu)
mir genau die gewuenschte 1.ip gibt.

hab gesucht und nix dazu in der doku gefunden, bzw. steht da was von
subshell, etc..
hat jmd nen tip was die klappern bei variablen bewirkt?

bye, jens.

Florian Philipp

unread,
Jan 7, 2013, 1:30:01 AM1/7/13
to
`ip=($ip_neu)` erzeugt ein Array ip. `$ip` gibt dir den ersten Eintrag,
also genauso wie `${ip[0]}`. Weil du `$ip_neu` nicht escaped hast
(`ip=("$ip_neu")`), ist jeder Eintrag whitespace-terminiert.

--
Florian

signature.asc

jens wefer

unread,
Jan 7, 2013, 6:10:01 PM1/7/13
to
Am Mon, 07 Jan 2013 07:22:25 +0100
schrieb Florian Philipp <li...@binarywings.net>:

> Am 07.01.2013 02:27, schrieb jens wefer:
> >
> > [...]
> >
>
> `ip=($ip_neu)` erzeugt ein Array ip. `$ip` gibt dir den ersten
> Eintrag, also genauso wie `${ip[0]}`. Weil du `$ip_neu` nicht escaped
> hast (`ip=("$ip_neu")`), ist jeder Eintrag whitespace-terminiert.
>
> --
> Florian

echo ${#ip_neu[@]} gibt 1 aus, also nur 1 element
ip=${ip_neu[0]} gibt mir alles im test 1219 zeichen
ip=($ip_neu) gibt 1.ip (getrennt durch space zur 2.
so wie ich dich verstanden hab muesste ${ip_neu[0]} mir auch doie erste
ip geben, tut es aber nicht.

bye, jens.

Florian Philipp

unread,
Jan 8, 2013, 8:30:03 AM1/8/13
to
Nicht wirklich. Bash hat zwar eine implizite Konvertierung von einfachen
zu Array-Variablen, aber die Konvertierung ist äquivalent zu
`ip=("$ip_neu")`, nicht `ip=($ip_neu)`.

BTW: Eine Alternative zum Splitten wäre folgendes:
ip=${ip_neu%%[$'\t'$'\n'' ']*}

Entfernt alles ab dem ersten Tabulator, Zeilenumbruch oder Leerzeichen
und speichert das Ergebnis in ip.

-- Florian Philipp

signature.asc

Markus Wagner

unread,
Jan 8, 2013, 9:20:01 AM1/8/13
to
Hi Jens,

${ip_neu[0]} kann nicht klappen, da ip_neu nur ein String ist.
Hier ein kurzes Beispiel:
---------------
#!/bin/bash
cat > e << EOF
123 456
789
EOF
ip_neu=`cat e`

ip=(${ip_neu})
echo $ip_neu
echo ${ip}
echo ${ip[0]}
echo ${ip[1]}
----------------
liefert:
----------------
123 456 789
123
123
456
----------------

Soweit ich die bash-internals verstanden habe, wird bei der Erzeugung
des Arrays "ip" der IFS als Trennsymbol berücksichtigt. Als Konvention
für die Dereferenzierung von ip wird ohne Index stets der erste Eintrag
zurückgeliefert - angelehnt an Dereferenzierung von Arrays in C...

Cheers,

Markus

jens wefer

unread,
Jan 8, 2013, 4:00:01 PM1/8/13
to

vielen dank an alle, das hat mir weitergeholfen.

bye, jens.
0 new messages