Bash: Die Erweiterung von Klammern in Skripts funktioniert aufgrund von unerwünschtem Entweichen nicht

8

Ich möchte so etwas in einem Bash-Skript machen. Ich verwende bash 4.1.10 .

%Vor%

Funktioniert (und wie erwartet) von der Shell selbst. Es löscht die 3 gewünschten Ordner und lässt alle anderen unberührt.

Wenn ich es ins Skript lege, passiert etwas Unerwünschtes. Zum Beispiel mein Skript:

%Vor%

Wenn ich dieses Skript ausführe, werden die Ordner nicht gelöscht.

Ich denke, das liegt an der Tatsache, dass einige unerwünschte Zitate auftreten. Ausgabe vom Skript mit #!/bin/bash -x :

%Vor%

was natürlich aufgrund der ' -Markierungen nicht gelingen kann.

Wie kann ich das in meinem Skript arbeiten?

    
Roland 01.07.2011, 14:06
quelle

9 Antworten

8

Laut der Manpage :

  

Die Reihenfolge der Erweiterungen lautet: geschweifte Erweiterung, Tilde-Erweiterung, Parameter, variable und arithmetische Erweiterung und Befehlsersetzung (von links nach rechts), Wortaufteilung und Pfadnamenerweiterung.

Um dies zu umgehen, fügen Sie eine weitere Erweiterungsebene hinzu:

%Vor%     
Michael Lowman 01.07.2011, 14:13
quelle
5

Da Sie ein Skript schreiben, gibt es keinen Grund, schwer zu wartenden Code mit eval tricks

zu schreiben %Vor%

oder

%Vor%     
glenn jackman 01.07.2011 14:55
quelle
2

Nein, es liegt an der Tatsache, dass die Klammererweiterung vor der Parametererweiterung stattfindet. Finden Sie einen anderen Weg, zB mit xargs .

%Vor%     
Ignacio Vazquez-Abrams 01.07.2011 14:12
quelle
2

Wenn Ihr Code neu angeordnet werden kann, können Sie echo und die Befehlsersetzung in bash verwenden. Etwas wie das:

%Vor%     
Jice 17.05.2012 22:33
quelle
1

Sie müssen braceexpand Flag aktivieren:

%Vor%     
user1338062 25.01.2013 18:16
quelle
0

Das Problem ist nicht, dass im Skriptmodus einige unerwünschte Zitate passieren , sondern dass Sie die Ordnernamen in eine Variable einfügen und der Inhalt der Variablen nach der geschweiften Klammer erweitert wird ist erledigt.
Wenn Sie das wirklich so machen wollen, müssen Sie eval :

verwenden %Vor%     
bmk 01.07.2011 14:12
quelle
0
%Vor%

Bearbeiten Der Rest ist nur für Informationen. Ich versuche, informativ zu sein, aber nicht wortreich: _)

Aktuelle Bashes haben die Option globstar. Dies könnte sich in der Zukunft als nützlich erweisen.

%Vor%     
sehe 01.07.2011 14:12
quelle
0

Ein weiterer Trick, den Sie verwenden können (anstelle des gefährlichen eval ), ist einfach nur echo in einer Untershell. Dies funktioniert zum Beispiel:

%Vor%

Ausgänge:

%Vor%

wie gewünscht. (Entfernen Sie das "Echo" in der zweiten Zeile, damit es rm tatsächlich tut.)

Der entscheidende Punkt ist, dass bash die Erweiterung vor -Parametern einschränkt, sodass Sie niemals eine durch Kommas getrennte Liste (umgeben von geschweiften Klammern oder nicht) in eine Variable einfügen wollen - wenn Sie das tun, Dann müssen Sie auf eval zurückgreifen. Sie können jedoch eine Liste von durch Leerzeichen getrennten Strings in eine Variable einfügen, indem Sie die geschweifte Klammerexpansion in einer Subshell-Zuweisung vor durchführen lassen.

    
ShreevatsaR 08.02.2013 05:42
quelle
-1

ersetzen {$VAR} durch ${VAR} : -)

    
cadrian 01.07.2011 14:13
quelle

Tags und Links

Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ qstntxt ___

Gibt es ein gsub-Äquivalent für Ganzzahlen oder Dezimalzahlen? Sollte gsub mit ganzen Zahlen arbeiten? Im Grunde versuche ich nur dezimal in ein Ruby-Formular einzutragen und was der Benutzer Kommas verwenden darf. Zum Beispiel möchte ich, dass der Benutzer 1.000.99 eingeben kann.

Ich habe versucht,

zu verwenden %Vor%

, aber erhalten Sie den folgenden Fehler "undefinierte Methode 'gsub' für 8: Fixnum", wobei "8" durch die Nummer ersetzt wird, die der Benutzer eingibt.

    
___ tag123ruby ___ Ruby ist eine multi-plattform Open-Source, dynamische objektorientierte interpretierte Sprache, erstellt von Yukihiro Matsumoto (Matz) im Jahr 1995. Die [Ruby] -Tag ist für Fragen im Zusammenhang mit der Ruby-Sprache, einschließlich seiner Syntax und seiner Bibliotheken . Fragen speziell zum Ruby-on-Rails-Framework sollten mit [ruby-on-rails], nicht [ruby] getaggt werden. Verwenden Sie dies nicht, um Ruby in der japanischen Sprache zu markieren. ___ tag123rubyonrails3 ___ Ruby on Rails ist ein in Ruby geschriebenes Open-Source-Web-Entwicklungs-Framework. Ruby on Rails folgt dem Prinzip der Konvention über die Konfiguration und befreit Sie davon, Dinge neu erfinden zu müssen, um produktiv zu bleiben. Verwenden Sie dieses Tag nur für Rails 3-spezifische Fragen und markieren Sie diese Fragen [ruby-on-rails]. ___ answer6542082 ___

Wenn Ihr Feld ein Fixnum ist, wird es niemals Kommas haben, da Rails die Benutzereingabe in eine Zahl umwandeln muss, um sie dort zu speichern.

Dies wird jedoch dadurch erreicht, dass to_i für die Eingabezeichenfolge aufgerufen wird, was nicht gewünscht ist. überschreibt den normalen Setter zu etwas wie

%Vor%

Nicht getestet, aber etwas ähnliches sollte funktionieren ...

Sie müssen an die Kommas gehen, während die Eingabe noch eine Zeichenfolge ist.

Bearbeiten: Wie in den Kommentaren erwähnt, benötigen Sie eine andere Konvertierung als %code% , wenn Sie Dezimalzahlen akzeptieren und etwas erstellen möchten, das keine ganze Zahl ist. Außerdem haben verschiedene Länder unterschiedliche Konventionen für numerische Interpunktion, daher ist dies keine vollständige Lösung.

    
___ answer6542084 ___

probiere %code% . Das heißt, entfernen Sie alles, was keine Ziffer ist. Regexen machen keinen Unterschied zwischen Ganzzahlen, Gleitkommazahlen, Dezimalzahlen usw. Es sind alle Zeichenketten. Und Rails wird es nicht korrekt für Sie konvertieren, weil es nur %code% oder %code% darauf aufruft.

BEARBEITEN:

eigentlich: %code% : alles, was keine Ziffer oder Dezimalpunkt ist, und wandle es in einen Float um.

    
___ tag123rubyonrails ___ Ruby on Rails ist ein Open-Source-Full-Stack-Webanwendungs-Framework, das in Ruby geschrieben ist. Es folgt dem populären MVC-Framework-Modell und ist bekannt für seinen "convention over configuration" -Ansatz für die Anwendungsentwicklung. ___