[linux-l] Datum in Script verwenden

Mike Dornberger Mike.Dornberger at gmx.de
Sa Apr 7 23:24:38 CEST 2007


Hi,

On Sat, Apr 07, 2007 at 07:57:41PM +0200, Nico Golde wrote:
> Und? Was hast du erwartet, wenn du das durch eine Pipe 
> schickst? Egal hier meine sh-kompatible Version:
> $ echo 456 | {
> > foo=123
> >  while read line; do
> > foo=$line
> > done;}
> $ echo $foo
> 456

ich glaube, Benjamin ging es darum, eine Variable zu ändern, die vor der
"while read"-Schleife gesetzt wurde und vorher schon mehrfach benutzt wurde.

Mein Vorschlag, man überschreibt nicht in Subroutinen globale Variablen,
sondern läßt sich was zurückgeben:

--- mytest.sh ---
#!/bin/sh

foo=123

foo=`echo 456 | (while read line; do arg=$line; done; echo $arg)`
echo $foo

# Oder halt per function
foo=123

get_last_arg() {
	while read line ; do
	        # do something with $line
		arg=$line
	done
	echo $arg
}

foo=`echo 456 | get_last_arg`
echo $foo

foo=123

#test ! -e argsfile && 
# (echo 'abc def ghi jkl mno pqr stu vwx yz' > argsfile || exit 1)
#
#foo=`tr ' ' '\n' < argsfile | get_last_arg`
foo=`echo 'abc def ghi jkl mno pqr stu vwx yz' | tr ' ' '\n' | get_last_arg`
echo $foo
--- end mytest.sh ---

Getestet mit posh, dash und bash ($ xxsh mytest.sh) und als executable
($ ./mytest.sh) unter Debian Sarge.

Was könnte denn da jetzt noch passieren? Man will Variablen ändern, deren
Namen man erst zur Laufzeit z. B. aus einer Config-File erhält? Dann halt
sich was für echo zusammenzimmern und das im Hauptprogramm dann halt durch
eval jagen. Naja, viel Spaß beim Quoten dann ggf.

Statt echo dann besser printf benutzen, weil echo abhängig von der
Implementierung kein -e und/oder -n kennt und auch schon mal munter ohne -e
auch Escape-Sequenzen interpretiert. (posh -c "echo 'a\nb'") Siehe dazu
auch: http://www.opengroup.org/onlinepubs/009695399/utilities/echo.html

Viele Grüße,
 Mike




Mehr Informationen über die Mailingliste linux-l