Discussion:
[gentoo-user-de] OT: bash () bei variablen
(zu alt für eine Antwort)
jens wefer
2013-01-07 01:30:02 UTC
Permalink
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
2013-01-07 06:30:01 UTC
Permalink
Post by jens wefer
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.
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.
`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
jens wefer
2013-01-07 23:10:01 UTC
Permalink
Am Mon, 07 Jan 2013 07:22:25 +0100
Post by Florian Philipp
[...]
`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
2013-01-08 13:30:03 UTC
Permalink
Post by jens wefer
Am Mon, 07 Jan 2013 07:22:25 +0100
Post by Florian Philipp
[...]
`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
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.
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
jens wefer
2013-01-08 21:00:01 UTC
Permalink
vielen dank an alle, das hat mir weitergeholfen.

bye, jens.

Markus Wagner
2013-01-08 14:20:01 UTC
Permalink
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
Post by jens wefer
Am Mon, 07 Jan 2013 07:22:25 +0100
Post by Florian Philipp
[...]
`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
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.
Loading...