Bash-Skript: Übergabe von Argumenten an mkfs

412
coverflower

Ich schreibe ein Bash-Skript, um meine Partitionen zu formatieren. Einer der Befehle, die ich ausführen möchte, ist folgende:

mkfs.btrfs -f -m single -L root /dev/sda1 

Also habe ich diesen Befehl in den Options-Teil -f -m single -L root und den Partition-Teil aufgeteilt /dev/sda1 und in Variablen wie folgt eingefügt:

mkfs.btrfs "$" /dev/"$" 

aber es scheitert mit:

mkfs.btrfs: invalid option -- ´ ´ 

Ich habe verschiedene Variationen davon ausprobiert, beispielsweise die doppelten Anführungszeichen in zwei Anführungszeichen setzen, aber alle versagen. Ich habe auch versucht, die beiden Teile in ein Array zu setzen und so auszuführen:

mkfs.btrfs "$" "$" 

oder so:

mkfs.btrfs "$" 

aber es scheitert auch.

Wenn ich es ohne den Option-Teil ausführte, funktioniert es. Ich schätze, dass das Problem aus dem leeren Raum zwischen den beiden Argumenten stammt, aber ich weiß nicht, wie ich es lösen soll.

0
Können Sie angeben, wie Sie das Skript auf der CLI ausgeführt haben? Es kann nur sein, dass Sie Ihre Argumente in Anführungszeichen setzen müssen. Wie: $ script "-f -m single -L root" "sda1" Gautam vor 5 Jahren 0
Es sind offenbar die Räume (alle), wie @Ignacio Vazquez-Abrams geschrieben hat. coverflower vor 5 Jahren 0

2 Antworten auf die Frage

3
Ignacio Vazquez-Abrams

Ich habe auch versucht, die beiden Teile in ein Array zu setzen ...

Nicht gut genug. Jedes einzelne Argument muss ein Element eines Arrays sein (oder der einzige Wert in der Variablen).

args1=(-f -m single -L root) args2=/dev/"$mypartition" mkfs.btrfs "$" "$args2" 
0
BytePorter

Das ist für mich immer ein großer Schmerz. Da keines Ihrer Argumente selbst Leerzeichen enthält, würde ich versuchen, die Anführungszeichen zu entfernen und es von Bash für Ihre $myoptionsVariable in Wörter zerlegen zu lassen. Also das:

mkfs.btrfs $ /dev/"$"

Mit den Anführungszeichen erhalten Sie ein Feld -f -m single -L rootmit Leerzeichen. Andernfalls sollte es in die einzelnen Felder unterteilt sein -f -m single -Lund rootdasselbe Verhalten zeigen wie das Eingeben mkfs.btrfs -f -m single -L root /dev/sda1in die interaktive Shell.

Wenn Sie einige Argumente haben, die Leerzeichen enthalten, müssen Sie möglicherweise mit der $IFSVariablen und Ihrer Kodierung etwas komplizierter machen.

Sie können auch die spezielle Variable verwenden, $@die eigene Regeln hat.

Ich schreibe alle meine Shell-Sachen an POSIX, aber ich bin sicher, dass es in Bash eine einfachere Möglichkeit gibt, dies zu tun.

Ich habe dies versucht: mkfs.btrfs $ / dev / "$ " noch einmal, aber es hat nicht funktioniert. Ich habe mir diese spezielle Variable $ @ angeschaut, aber wenn ich mich nicht irre, dann sind es Funktionen, die Sie selbst definieren und nicht gegebene Funktionen. coverflower vor 5 Jahren 1
Nein, du hast recht, ich dachte, das Entfernen der Anführungszeichen würde in diesem speziellen Fall funktionieren und einfach sein. `$ @` ist ein spezieller Parameter, mit dem Sie das Verhalten eines Arrays nachahmen können, da `sh` kein Array besitzt. Um ehrlich zu sein, schreibe ich meine Skripte, um `sh`-kompatibel zu sein, weil es mir Spaß macht und es in allen POSIX-kompatiblen Shells, einschließlich Bash, unterstützt wird. Wenn Sie nur zum Spaß interessiert sind, ist http://www.etalabs.net/sh_tricks.html eine kurze, gut geschriebene und präsentierte Liste einiger nützlicherer Tricks (einschließlich der Verwendung von `$ @`). BytePorter vor 5 Jahren 0