Angenommen, ich habe in main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
und in install.sh:
echo $1
Dies soll widerhallen "a string"
, aber es hallt nichts wider. Warum?
Angenommen, ich habe in main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
und in install.sh:
echo $1
Dies soll widerhallen "a string"
, aber es hallt nichts wider. Warum?
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
oder dash
Ihr main.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):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
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:
. $HOME/install.sh "$NAME"
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
. Ich sollte solche Dinge wahrscheinlich nicht tun, wenn ich nach Fehlern suche
Stellen Sie einfach Ihre Parameter ein, bevor Sie das Skript aufrufen!
#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
set -- $NAME ;
. install.sh ;
fi
exit;
#!/bin/bash
echo " i am sourced by [ ${0##*/} ]";
echo " with [ $@ ] as parametr(s) ";
exit;
u@h$ ./main.sh some args
i am sourced by [ main.sh ]
with [ some args ] as parametr(s)
u@h$
--
gleichen Befehlsargumenten auf:set -- -v foo -l bar -j "${bin}"