OT: bash () bei variablen

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

OT: bash () bei variablen

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.

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.

Reply | Threaded
Open this post in threaded view
|

Re: OT: bash () bei variablen

Florian Philipp-6
Am 07.01.2013 02:27, schrieb 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.
>
> 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.
>
`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 (270 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: OT: bash () bei variablen

Jens Wefer
Am Mon, 07 Jan 2013 07:22:25 +0100
schrieb Florian Philipp <[hidden email]>:

> 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.

Reply | Threaded
Open this post in threaded view
|

Re: OT: bash () bei variablen

Florian Philipp-6
Am 08.01.2013 00:05, schrieb jens wefer:

> Am Mon, 07 Jan 2013 07:22:25 +0100
> schrieb Florian Philipp <[hidden email]>:
>
>> 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.
>
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 (270 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: OT: bash () bei variablen

Markus Wagner-2
In reply to this post by Jens Wefer
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

On 08.01.13 00:05, jens wefer wrote:

> Am Mon, 07 Jan 2013 07:22:25 +0100
> schrieb Florian Philipp <[hidden email]>:
>
>> 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.
>

Reply | Threaded
Open this post in threaded view
|

Re: OT: bash () bei variablen

Jens Wefer
In reply to this post by Florian Philipp-6

vielen dank an alle, das hat mir weitergeholfen.

bye, jens.