[bash] Substitution in Variablen

02/06/2011 - 02:54 von mhenn | Report spam
Hallo,
nachdem ich 'man bash' (im Speziellen: Parameter Expansion) gelesen
habe, habe ich folgendes versucht:
(getestet mit GNU bash, Version 4.1.5(1)-release (i686-pc-linux-gnu))

set 'la le lu'
echo " \$*='$*'"
echo " '${*// /_}'"
# ersetzt alle leerzeichen in * mit '_'
# das funktioniert auch
# ja, das kann man auch mit sed oder tr oder sonst was machen,
# aber ich wollte das einfach mal so machen wie hier

foo() { echo " \$*='$*'"; echo " ${*// /_}"; }
foo la le lu


In Aktion sieht das ganze folgendermassen aus:

$ set 'la le lu'
$ echo " \$*='$*'"
$*='la le lu'
$ echo " '${*// /_}'"
'la_le_lu'
$ foo() { echo " \$*='$*'"; echo " '${*// /_}'"; }
$ foo la le lu
$*='la le lu'
'la le lu'

Nun meine Frage:

****************************************************
* Warum funktioniert ${*// /_} direkt in der bash, *
* aber in der Funktion nicht? *
****************************************************

Es scheint irgendwie etwas mit dem Leerzeichen zu tun zu haben, denn
Folgendes funktioniert wie erwartet:

$ foo() { echo " \$*='$*'"; echo " ${*//l/_}"; }
$ foo la le lu
$*='la le lu'
_a _e _u

Das Leerzeichen zu escapen bringt auch nichts:

$ foo() { echo " \$*='$*'"; echo " ${*//\ /_}"; }
$ foo la le lu
$*='la le lu'
la le lu

Uebersehe ich etwas? Oder ist das ein bug?
Danke fuer jegliche Hinweise.
 

Lesen sie die antworten

#1 Cyrus Kriticos
02/06/2011 - 10:02 | Warnen spam
On 06/02/2011 02:54 AM, mhenn wrote:
Hallo,
nachdem ich 'man bash' (im Speziellen: Parameter Expansion) gelesen
habe, habe ich folgendes versucht:
(getestet mit GNU bash, Version 4.1.5(1)-release (i686-pc-linux-gnu))

set 'la le lu'
echo " \$*='$*'"
echo " '${*// /_}'"
# ersetzt alle leerzeichen in * mit '_'
# das funktioniert auch
# ja, das kann man auch mit sed oder tr oder sonst was machen,
# aber ich wollte das einfach mal so machen wie hier

foo() { echo " \$*='$*'"; echo " ${*// /_}"; }
foo la le lu



In der letzten Zeile muss es, wie in Deiner set-Zeile,

foo 'la le lu'

heißen.




Auszug aus man bash zum *

* Expands to the positional parameters, starting from one. When the
expansion occurs within double quotes, it expands to a single word with the
value of each parameter separated by the first character of the IFS special
variable. That is, "$*" is equivalent to "$1c$2c...", where c is the first
character of the value of the IFS variable. If IFS is unset, the
parameters are separated by spaces. If IFS is null, the parameters are
joined without intervening separators.

Grüße | NDR-Beitrag ueber MCR Geldschrank Vertriebsgesellschaft Berlin
Cyrus | http://www.lachschon.de/item/64671-...lechmafia/

Ähnliche fragen