Bitte aktualisieren Sie die Frage nicht. Auf diese Weise können wir nicht sehen, was mit Ihrer Ausgangsfrage falsch war. Ich habe es gerade zurückgerollt.
Valentin Bajrami
Antworten:
20
Michael Mrozek deckt die meisten Probleme ab und seine Korrekturen werden funktionieren, da Sie Bash verwenden.
Möglicherweise interessiert Sie die Tatsache, dass die Möglichkeit, ein Skript mit Argumenten zu versehen, ein Bashismus ist. In shoder dashIhr main.shwird nichts zurückmelden, da die Argumente für das Quellenskript ignoriert werden und $1auf das Argument für verweisenmain.sh.
Wenn Sie das Skript shals Quelle angeben, haben Sie den Eindruck, Sie hätten den Text des Skripts einfach kopiert und in die Datei eingefügt, aus der es stammt. Beachten Sie Folgendes (Anmerkung, ich habe die von Michael empfohlene Korrektur vorgenommen):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
"In sh oder dash wird Ihre main.sh nichts wiedergeben, da die Argumente für das Quellenskript ignoriert werden und $ 1 auf das Argument für main.sh verweist." Genau das passiert. Danke für die Antwort.
Jemand benutzt Sie immer noch MS-DOS
Ich habe Ihre Antwort als akzeptiert markiert, weil das eigentliche Problem nicht darin bestand, dass mein Skript fehlerhaft war, sondern hauptsächlich, weil ich sh mit bash gleichgesetzt habe und bash es in dieser Situation nicht gut macht, sh zu emulieren. Ihre Antwort hat mich über dieses Problem aufgeklärt, danke;
Jemand verwendet Sie immer noch MS-DOS
2
Technisch gesehen ist es hier eher ein Kshism (bereits in Ksh86 vorhanden, wahrscheinlich früher). @ SomebodystillusesyouMS-DOS, die "sh" -Spezifikation sagt nicht aus, was passieren soll, wenn Sie zusätzliche Argumente übergeben, sodass das Bindestrich- oder Bash-Verhalten nicht mehr "sh" ist als das andere und gleichermaßen gültig.
Stéphane Chazelas
16
Ich sehe drei Fehler:
Ihre Zuweisungszeile ist falsch:
$NAME="a string"
Wenn Sie einer Variablen zuweisen, wird das $; es sollte sein:
NAME="a string"
Du wirst vermisst then; Die bedingte Linie sollte sein:
if[-f $HOME/install.sh ];then
Sie zitieren nicht $NAME, obwohl es Leerzeichen gibt. Die Quellzeile sollte sein:
Er hat auch ein paar andere Fehler, aber ich denke nicht, dass dies unbedingt die Ursache des von ihm angesprochenen Problems ist.
Steven D
@Steven Du hast recht, es gab noch ein paar, die ich nicht erwähnt habe; Es funktioniert für mich mit den Korrekturen, die ich jetzt aufgeführt habe
Michael Mrozek
@Steven Als ich das Skript zusammenstellte, um es auszuprobieren, habe ich es auf abgekürzt [ -f $HOME/install.sh ] && . $HOME/install.sh $NAME. Ich sollte solche Dinge wahrscheinlich nicht tun, wenn ich nach Fehlern suche
Michael Mrozek
Es sieht so aus, als wäre das andere Problem, von dem ich dachte, es gäbe eigentlich kein Problem, da er BASH ausdrücklich erwähnt.
Steven D
5
Stellen Sie einfach Ihre Parameter ein, bevor Sie das Skript aufrufen!
Antworten:
Michael Mrozek deckt die meisten Probleme ab und seine Korrekturen werden funktionieren, da Sie Bash verwenden.
Möglicherweise interessiert Sie die Tatsache, dass die Möglichkeit, ein Skript mit Argumenten zu versehen, ein Bashismus ist. In
sh
oderdash
Ihrmain.sh
wird nichts zurückmelden, da die Argumente für das Quellenskript ignoriert werden und$1
auf das Argument für verweisenmain.sh.
Wenn Sie das Skript
sh
als Quelle angeben, haben Sie den Eindruck, Sie hätten den Text des Skripts einfach kopiert und in die Datei eingefügt, aus der es stammt. Beachten Sie Folgendes (Anmerkung, ich habe die von Michael empfohlene Korrektur vorgenommen):quelle
Ich sehe drei Fehler:
Ihre Zuweisungszeile ist falsch:
Wenn Sie einer Variablen zuweisen, wird das
$
; es sollte sein:Du wirst vermisst
then
; Die bedingte Linie sollte sein:Sie zitieren nicht
$NAME
, obwohl es Leerzeichen gibt. Die Quellzeile sollte sein:quelle
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
. Ich sollte solche Dinge wahrscheinlich nicht tun, wenn ich nach Fehlern sucheStellen Sie einfach Ihre Parameter ein, bevor Sie das Skript aufrufen!
main.sh
install.sh
Prüfung
quelle
--
gleichen Befehlsargumenten auf:set -- -v foo -l bar -j "${bin}"