Ich erstelle ein Shell-Skript für ein Projekt. Eine Funktion, die unbedingt erforderlich ist, ist die Möglichkeit, eine Kopie einer Konfigurationsdatei als neue Datei zu erstellen. Dies wird jedoch nicht statisch gehandhabt. Ich erstelle und lege eine Laufzeitvariable fest.( $modloader
)das kommt vom Dateinamen des Shell-Skripts und kopiert die Vorlage unter diesem Namen. Ich habe einige Tests mit statischen Dateinamen durchgeführt und cp
es funktioniert gut, aber es scheint zu scheitern, wenn geprüft wird, ob die Datei bereits vorhanden ist(Zeile 5). Wenn ich dies im Terminal ausführe, wird die gesuchte Datei nicht angezeigt. Ich glaube, es sucht in einem wörtlicheren Kontext danach und nicht'verstehen'es verwendet eine Variable.
#!/bin/sh
modloader=`basename -s .sh "$0"`
if "./Settings/$modloader.ini"; then
cp "./Settings/Template.ini" "./Settings/$modloader.ini"
fi
Antwort1
scheint beim Prüfen, ob die Datei bereits vorhanden ist, auseinanderzufallen
Ich sehe nicht, dass Sie prüfen, ob die Datei bereits vorhanden ist. Ihre if "./Settings/$modloader.ini";
Versuche,laufendie INI-Datei. Im Allgemeinen kann es ein gültiger Test für etwas sein, wenn die Datei so konzipiert ist, dass sie auf diese Weise ausgeführt wird und den Exit-Status entsprechend dem, was Sie testen möchten, zurückgibt.
Selbst wenn das Ausführen der betreffenden Datei möglich wäre, hätte es keinen Sinn, die Datei zu einem Tester ihrer eigenen (Nicht-)Existenz zu machen.
So können Sie in einer Shell richtig feststellen, ob die Datei existiert:
test -e "./Settings/$modloader.ini"
# or equivalently
[ -e "./Settings/$modloader.ini" ]
Anmerkungen:
test -e
Tests für eine Datei vonjeder Typ.test -e
oder dies führt zu einem falschen Negativ (d. h. einem Exit-Status ungleich Null), wenn die Berechtigungen für ein relevantes Verzeichnis (z. B.Settings
in Ihrem Fall) es nicht zulassen, zu überprüfen, ob die Datei existiert.
Zusätzlich möchten Sie den Test negieren. Die Zeile in Ihrem Code würde wie folgt aussehen:
if ! [ -e "./Settings/$modloader.ini" ]; then
if
ist jedoch nicht notwendig. GNU cp
mit -n
( --no-clobber
) könnte alles sein, was Sie anstelle dessen brauchen if … fi
. Die Option ist nicht portierbar und Sie benötigen höchstwahrscheinlich eine andere nicht portierbare Option -T
( --no-target-directory
), falls sich das Ziel als (ein symbolischer Link zu) einem Verzeichnis herausstellt.
cp -nT "./Settings/Template.ini" "./Settings/$modloader.ini"
cp -n
Beachten Sie , dass der Beendigungsstatus lautet, wenn das Ziel bereits existiert und es sich daher um einen No-Op 0
handelt. Sie erhalten denselben Beendigungsstatus, wenn das Ziel nicht existiert und das Kopieren erfolgreich ist. Das bedeutet, wenn Sie mehr tun möchten (als cp
), je nachdem, ob die Datei existiert oder nicht, benötigen Sie if
ohnehin „prior“.