Ich möchte so etwas in einem Bash-Skript machen. Ich verwende bash 4.1.10
.
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
:
was natürlich aufgrund der '
-Markierungen nicht gelingen kann.
Wie kann ich das in meinem Skript arbeiten?
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% Da Sie ein Skript schreiben, gibt es keinen Grund, schwer zu wartenden Code mit eval
tricks
oder
%Vor% Nein, es liegt an der Tatsache, dass die Klammererweiterung vor der Parametererweiterung stattfindet. Finden Sie einen anderen Weg, zB mit xargs
.
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
:
Ein weiterer Trick, den Sie verwenden können (anstelle des gefährlichen eval
), ist einfach nur echo
in einer Untershell. Dies funktioniert zum Beispiel:
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.
Tags und Links escaping bash brace-expansion
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.
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.
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.