bash - bad substitution [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Ozelot
Beiträge: 1515
Registriert: 18.11.2007 09:52:58

bash - bad substitution [gelöst]

Beitrag von Ozelot » 01.03.2011 13:14:38

Ich kriege in einem Skript bei dem Ausdruck

Code: Alles auswählen

a=${b//[^0-9]/}
von der bash einen "bad substitution" error. Eigentlich soll das nur die Ziffern aus einem String extrahieren. Stimmt da was nicht?

Komisch ist: direkt auf der Kommandozeile funktioniert der Ausdruck. Aber wenn er im Skript in einer "while read b" - Schleife vorkommt, kriege ich den Fehler.
Zuletzt geändert von Ozelot am 02.03.2011 19:27:12, insgesamt 2-mal geändert.

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: bash - bad substitution

Beitrag von nepos » 01.03.2011 14:56:43

Sollte das nicht

Code: Alles auswählen

a=${b/[^0-9]/}
heissen? Imho sind da zuviele Slashes drin.

Ozelot
Beiträge: 1515
Registriert: 18.11.2007 09:52:58

Re: bash - bad substitution

Beitrag von Ozelot » 01.03.2011 15:54:28

Wenn ich einen Slash weglasse, eliminiert er nur den ersten Buchstaben, nicht alle auftretenden. Ich hab mich da an http://wiki.bash-hackers.org/syntax/pe? ... nd_replace orientiert.

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: bash - bad substitution

Beitrag von newdeb » 01.03.2011 15:55:46

Vielleicht ist die Variable b nicht gefüllt:

Code: Alles auswählen

 ${//[^0-9]/}
bash: ${//[^0-9]/}: bad substitution
D.h. das Problem liegt nicht im Substitutions-Ausdruck, sondern in der while read-Schleife.
Aber da dein Skript offenbar streng geheim ist, bleibt das Spekulation.
EDIT: wenn b leer oder unset ist, kommt der Fehler nicht, mein Beispiel ist falsch gewählt :?
Ein Skriptauszug wäre aber trotzdem hilfreich.

Ozelot
Beiträge: 1515
Registriert: 18.11.2007 09:52:58

Re: bash - bad substitution

Beitrag von Ozelot » 01.03.2011 23:50:49

Nein, nicht streng geheim - aber ich mache noch derart viel falsch und umständlich, daß ihr sonst kaum aus dem Korrigieren heraus kommt..

Auf dieses Codeschnipsel konnte ich es zusammendampfen, das bei mir den Fehler generiert.

Code: Alles auswählen

    if [ -e *.wav ]; then
      find -name \*.wav | while read mixe
      do
        nurzahl=${mixe//[^0-9]/}
      done
    fi
(Ziel des Skripts ist es, aus verschiedenen Unterverzeichnissen Wav-Dateien mit der höchsten Nummerierung herauszufischen)

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: bash - bad substitution

Beitrag von rendegast » 02.03.2011 06:58:59

Vielleicht (da)sh <-> bash ?
'#!/bin/sh' <-> '#!/bin/bash'


Code: Alles auswählen

if [ -e *.wav ] ...
Das geht schief, wenn es mehr als 1 wav gibt.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Ozelot
Beiträge: 1515
Registriert: 18.11.2007 09:52:58

Re: bash - bad substitution

Beitrag von Ozelot » 02.03.2011 19:26:30

dash wars nicht - ich bin noch auf Lenny unterwegs.

Aber wenn ich die Abfrage durch

Code: Alles auswählen

ls | grep .wav
if [ $? -eq 0 ]...
ersetze geht alles.

Warum es schief ging ist mir aber nicht ganz klar.. denn ich hatte die Fehler schon bevor ich diese fehlerhafte if-Abfrage eingebaut habe. Aber jetzt ist er weg. Muß wohl doch was mit unbefüllten Variablen zu tun haben.

Danke -

Antworten