bash: Länge einer Variable
Wie frage ich die Länge einer Variable ab, also zB var1="ab" -> 2 var2="ab c" -> 4 var3="" -> 0 Wie "trimme" ich eine Varibale, d.h Leerzeichen am Anfang oder Ende sollen entfernt werden? zB " ab" -> "ab" oder "cd " -> "cd" Wie das mit sed geht ist klar, geht das aber auch anders mit einem "direkten" Befehl? Al
On Friday 12 December 2003 16:25, Al Bogner wrote:
Wie frage ich die Länge einer Variable ab, also zB
"man expr", /length
Wie "trimme" ich eine Varibale, d.h Leerzeichen am Anfang oder Ende sollen entfernt werden?
Wenn Du sicherstellen kannst, daß keine Leerzeichen in der Variablen sind, kannst Du mit "set" operieren: set $var var="$1" Hinweis: Zeichenverarbeitung in der Shell ist _evil_. Verwende eine P-Sprache (Perl, PHP, Python) für Dein Problem. Das ist _sehr_ viel effektiver. Deine Frage zeigt an, daß Du gerade das Programmieräquivalent zu einem Hammer für Schrauben verwendest. Kristian
Am Freitag, 12. Dezember 2003 17:23 schrieb Kristian Köhntopp:
"man expr", /length
Danke für den Hinweis.
Wie "trimme" ich eine Varibale, d.h Leerzeichen am Anfang oder Ende sollen entfernt werden?
Wenn Du sicherstellen kannst, daß keine Leerzeichen in der Variablen sind, kannst Du mit "set" operieren:
set $var var="$1"
Doch da gibt es Leerzeichen, dann werde ich das mit sed in der Art "| sed -e "s/ //g"` lösen.
Hinweis: Zeichenverarbeitung in der Shell ist _evil_. Verwende eine P-Sprache (Perl, PHP, Python) für Dein Problem. Das ist _sehr_ viel effektiver.
Das Problem ist, wenn man ein _gewachsenes_ Shellscript von ein paar hundert Zeilen hat, dann will man das nicht so ohne weiteres neu programmieren bzw. neu in einer anderen Sprache überdenken. Grundsätzlich hast du natürlich recht und mein nächstes Projekt wird unter Python laufen, nur bin ich in der Regel am Überarbeiten bestehender Shellscripts und ich merke man kann bei der bash immer wieder dazu lernen und kommt auf Dinge an die man überhaupt nicht gedacht hat :-) Al
Hallo, Am Fri, 12 Dec 2003, Al Bogner schrieb:
Am Freitag, 12. Dezember 2003 17:23 schrieb Kristian Köhntopp:
Wie "trimme" ich eine Varibale, d.h Leerzeichen am Anfang oder Ende sollen entfernt werden?
Wenn Du sicherstellen kannst, daß keine Leerzeichen in der Variablen sind, kannst Du mit "set" operieren:
set $var var="$1"
Doch da gibt es Leerzeichen, dann werde ich das mit sed in der Art "| sed -e "s/ //g"` lösen.
$ ( var=" foo bar "; echo "'$var'"; set -- $var; var="$@"; echo "'$var'"; ) ' foo bar ' 'foo bar' Wenn allerdings die Leerzeichen zwischen foo und bar so erhalten werden muessen, hilft sed: $ ( var=" foo bar "; echo "'$var'"; var="`echo \"$var\" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'`"; echo "'$var'"; ) ' foo bar ' 'foo bar' Noch Fragen? -dnh -- [Hotline-Ping-Pong:] Telekom2000: Ihr Anschluss ist in Ordnung -> T-Online: Keine Netzwerkunterstützung -> Telekom4433: Das ist ein TO-Problem -> T-Online: Das ist ein MS-Problem -> Microsoft: Haben Sie _ihre_ Windows-CD Windows-CD parat? ->Kunde: Weia. *Klick* -- Holger Eckert
Am Freitag, 12. Dezember 2003 20:29 schrieb David Haller:
Wenn allerdings die Leerzeichen zwischen foo und bar so erhalten werden muessen, hilft sed:
Noch Fragen?
Das erscheint mir alles nicht "lesbarer" als mit meiner sed-Variante. Ich hätte gehofft, dass es sowas ähnlich simples wie trim bei mysql gibt. Nein danke, dazu nicht, aber im Thread nebenan (elif) bin ich am rätseln. Al
Am Freitag, 12. Dezember 2003 17:23 schrieb Kristian Köhntopp:
On Friday 12 December 2003 16:25, Al Bogner wrote:
Wie frage ich die Länge einer Variable ab, also zB var3="" -> 0
"man expr", /length
var="" ~> laenge=`expr length $var` expr: Syntaxfehler echo $laenge Das tut noch nicht so ganz was ich mir vorstelle. $laenge sollte dann 0 sein. Al
Hallo, Am Fri, 12 Dec 2003, Al Bogner schrieb:
Am Freitag, 12. Dezember 2003 17:23 schrieb Kristian Köhntopp:
On Friday 12 December 2003 16:25, Al Bogner wrote:
Wie frage ich die Länge einer Variable ab, also zB var3="" -> 0
"man expr", /length
var="" ~> laenge=`expr length $var` expr: Syntaxfehler echo $laenge
Das tut noch nicht so ganz was ich mir vorstelle. $laenge sollte dann 0 sein.
<gebetsmuehle> Standardfehler! Du hast die Variable nicht gequotet! </gebetsmuehle> 'expr' bekommt nur noch das expr length zu sehen, aber kein Argument mehr, denn das hat die shell schon expandiert und eben durch nichts ersetzt (s.u.). Richtig ist: laenge=`expr length "$var"` ^! ^! Bsp: $ ( var=""; echo `expr length`; ) expr: syntax error $ ( var=""; echo `expr length $var`; ) expr: syntax error $ ( var=""; echo `expr length "$var"`; ) 0 $ ( var="foo"; echo `expr length "$var"`; ) 3 Lass dir das eine Lehre sein! Variablen sind _immer_ zu quoten... ;) Ok, ja, es gibt Ausnahmen, diese sind aber sehr exotisch und in diesen Faellen sind dann weitere Vorkehrungen (escapen) zu treffen. Da sollte man dann eh wissen was man macht. -dnh -- Yep, definately trees, I remember them from last time I was let loose in the big blue room. -- Rob Adams in the SDM
Am Freitag, 12. Dezember 2003 23:17 schrieb David Haller:
Variablen sind _immer_ zu quoten... ;)
Ok, ich war gerade wieder davon abgekommen, weil es nicht so gut lesbar ist. Wie quotet man dann am besten: echo "Das ist Variable \"""$A""\"" Wenn man in einer Ausgabe mehrere Variablen wirkt das ziemlich verwirrend, wenn es auch richtig ist. Al
Hallo, Am Fri, 12 Dec 2003, Al Bogner schrieb:
Am Freitag, 12. Dezember 2003 23:17 schrieb David Haller:
Variablen sind _immer_ zu quoten... ;)
Ok, ich war gerade wieder davon abgekommen, weil es nicht so gut lesbar ist.
Wie quotet man dann am besten:
echo "Das ist Variable \"""$A""\""
Wieso baust du hier 'Das ist die Variable "', '$A' und '"' einzeln in "" ein? Einmal "" 'um alles' reicht doch (s.u.) ;)
Wenn man in einer Ausgabe mehrere Variablen wirkt das ziemlich verwirrend, wenn es auch richtig ist.
Im echo "foo $var" ist das ja schon gequotet. Und bei echo ist das quoten i.d.R. eh irrelevant[1]. Und geht natuerlich auch mit mehreren Variablen. Wenn du konkret Variablen kennzeichnen willst, bietet sich folgendes an: A="foo"; B="bar" echo "Das ist Variable A=$A, B=$B" echo "Das ist Variable A=\"$A\", B=\"$B\"" echo "Das ist Variable A='$A', B='$B'" echo "Das ist Variable A=»$A«, B=»$B«" oder andere Varianten davon ;) Relevant sind eigentlich nur die aeusseren ""... -dnh [1] wenn das echo in die Ausgabe schreibt, wenn man folgendes hat: var2="`echo \"$var\" | sed 's/u/x/'`" ist das was anderes. -- Disclaimer - These opiini^H^H damn! ^H^H ^Q ^[ .. :w :q :wq :wq! ^d X^? exit X Q ^C ^c ^? :quitbye CtrlAltDel ~~q :~q logout save/quit :!QUIT ^[zz ^[ZZZZZZ ^H man vi ^@ ^L ^[c ^# ^E ^X ^I ^T ? help helpquit ^D ^d man help ^C exit ?Quit ?q CtrlShftDel "Hey, what does this button d..."
On Friday 12 December 2003 23:03, Al Bogner wrote:
Das tut noch nicht so ganz was ich mir vorstelle. $laenge sollte dann 0 sein.
Verwende "" um jeden Gebrauch einer Variablen in Shell. Lies http:// www.koehntopp.de/kris/artikel/unix/shellprogrammierung/ Und verwende dann eine P-Sprache für die Stringverarbeitung. Shell ist wirklich das falsche Tool. Kristian -- http://www.amazon.de/exec/obidos/wishlist/18E5SVQ5HJZXG
Hallo Al, hallo Leute, Am Freitag, 12. Dezember 2003 16:25 schrieb Al Bogner:
Wie frage ich die Länge einer Variable ab, also zB
var1="ab" -> 2 var2="ab c" -> 4 var3="" -> 0
Bash-intern: cb@tux:~> test="abc" cb@tux:~> echo ${#test} 3 cb@tux:~> test="abcdef" cb@tux:~> echo ${#test} 6 Andere Lösungsmöglichkeiten wurden Dir ja schon zu Genüge vorgeschlagen.
Wie "trimme" ich eine Varibale, d.h Leerzeichen am Anfang oder Ende sollen entfernt werden?
zB " ab" -> "ab" oder "cd " -> "cd" Wie das mit sed geht ist klar, geht das aber auch anders mit einem "direkten" Befehl?
Bash-intern geht das wohl nicht, deshalb: cb@tux:~> test=" ab c " cb@tux:~> test2="`echo -n \"$test\" | sed 's/^ *//; s/ *$//'`" cb@tux:~> echo "$test2"x # das x nur zur Markierung des Zeilenendes ab cx Falls Du auch Tabs an Zeilenanfang oder -ende erwischen willst, in sed einfach [ ]* verwenden. ^^^^^^ Leerzeichen + Tab Gruß Christian Boltz --
Und nun rate mal, warum ausgerechnet v.a. Vielschreiber mutt verwenden. Sicher nicht, weil KMail besser waere. Weil eine Handvoll muttschisten die alle dazu gezwungen hat? ;) [> David Haller und Manfred Misch in suse-linux]
participants (4)
-
Al Bogner
-
Christian Boltz
-
David Haller
-
Kristian Köhntopp