Datei per Variable kopieren, falls nicht bereits vorhanden

Datei per Variable kopieren, falls nicht bereits vorhanden

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 cpes 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 -eTests für eine Datei vonjeder Typ.
  • test -eoder dies führt zu einem falschen Negativ (d. h. einem Exit-Status ungleich Null), wenn die Berechtigungen für ein relevantes Verzeichnis (z. B. Settingsin 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

ifist jedoch nicht notwendig. GNU cpmit -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 -nBeachten Sie , dass der Beendigungsstatus lautet, wenn das Ziel bereits existiert und es sich daher um einen No-Op 0handelt. 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 ifohnehin „prior“.

verwandte Informationen