Bash Scripting: Contexts

Hi,

von Perl kenne ich das Prinzip von Contexts im Zusammenhang mit skalaren Variabeln. Ist das in Bash auch so? Der folgende Ouput macht mich etwas stutzig:

Code:
mathias@wizard:~$ NUM="text"
mathias@wizard:~$ echo $(( $NUM + 1 ))
1
mathias@wizard:~$ TEXT="some text"
mathias@wizard:~$ echo $(( $TEXT + 4 ))
bash: some text + 4 : syntax error in expression (error token is "text + 4 ")
mathias@wizard:~$ echo $(( $TEXT + 1 ))
bash: some text + 1 : syntax error in expression (error token is "text + 1 ")
mathias@wizard:~$ NUM="text"
mathias@wizard:~$ echo $(( $NUM + 1 ))
1
mathias@wizard:~$ NUM="text "
mathias@wizard:~$ echo $(( $NUM + 1 ))
1
mathias@wizard:~$ echo $(( $NUM + 2 ))
2
mathias@wizard:~$ echo $(( $NUM + 4 ))
4
mathias@wizard:~$

Warum kommt mit NUM ein Wert raus bei der arithmetischen Operation und mit TEXT ein Fehler? Entweder ist das komisch oder ich bin gerade total daneben ...

cu
serow
 
dann scheint die bash entweder $num oder $text selber zu verwenden, vermute ich mal.

zsh:
xeno@galahad:~ ? NUM="text"
xeno@galahad:~ ? TEXT="text"
xeno@galahad:~ ? echo $(( $NUM + 2 ))
2
xeno@galahad:~ ? echo $(( $TEXT + 2 ))
2
 
Hi,

also bei mir geht dein Beispielcode genau wie bei dir, aber scheinbar hat er ein Problem mit white spaces!?!

Code:
mathias@wizard:~$ NUM="text"
mathias@wizard:~$ TEXT="text"
mathias@wizard:~$ echo $(( $NUM + 2 ))
2
mathias@wizard:~$ echo $(( $TEXT + 3 ))
3
mathias@wizard:~$ TEXT="text with spaces"
mathias@wizard:~$ echo $(( $TEXT + 3 ))
bash: text with spaces + 3 : syntax error in expression (error token is "with spaces + 3 ")
mathias@wizard:~$

cu
serow
 
in der tat...

xeno@galahad:~ ? NUM="foo bar "
xeno@galahad:~ ? echo $(( $NUM + 2 ))
zsh: bad math expression: operator expected at `bar + 2 '

er meckert aber nur, wenn er zwei strings findet. sowas wie " foo " geht ohne probleme. und ich kann dir echt nicht sagen warum das so ist :D
 
Original von xeno
er meckert aber nur, wenn er zwei strings findet. sowas wie " foo " geht ohne probleme. und ich kann dir echt nicht sagen warum das so ist :D

Ich würde sagen, der Bash fehlt da ein Rechenzeichen zwischen den beiden Strings. $(( 1 2 + 3)) würde ja auch nicht wirklich Sinn machen.
Wenn nur ein Space am Ende ist, dann macht das natürlich nichts, da dann kein zusätzlicher Operand hinzukommt.

Was ich merkwürdig finde ist, dass die Bash überhaupt mit Strings rechnet. ;)
 
stimmt, liegt auf der hand eigentlich. und warum sie mit strings rechnen kann führe ich mal darauf zurück, dass alles was nicht int ist einfach 0 ist.
 
Original von xeno
stimmt, liegt auf der hand eigentlich. und warum sie mit strings rechnen kann führe ich mal darauf zurück, dass alles was nicht int ist einfach 0 ist.

Richtig - deswegen würde ich ja vermuten, dass "text" + 1 nicht anders behandelt wird als "some text" + 1 - einfach weil alles was kein Integer ist (some text) 0 ist ;)

Bash scripting ist das bescheuertste was mir je untergekommen ist ...

cu
Mathias
 
Bash scripting ist das bescheuertste was mir je untergekommen ist ...

:D , hey, da brutzelt auch nicht gleich die CPU durch, wenn beim ausführen ein Datentypenkonflikt besteht. Bei C z.B. hat sowas halt weitreichernde Folgen. Die Bashleute sehen das viel lockerer. *g
 
vielleicht hilft euch ja das lesen der man-pages ;-)

wie xeno schon schrieb, tritt das problem bei mehreren worten auf.
nicht konvertierbare texte werden mit 0 gleich gesetzt, sind mehrer worte durch metazeichen getrennt, dann ist der ausdruck durch die substitution arithmetisch unsinnig und wird mit einer fehlermeldung quittiert. was daran bescheuert sein soll erschliesst sich mir nicht......
 
Zurück
Oben