Unix-Skriptproblem

Unix-Skriptproblem

Ich habe ein einfaches Skript, das auf einem FreeBSD-Rechner mit dem folgenden Code läuft:

#!/bin/sh
`sed -i .bak '\:#start 172.0.0.3:,\:#end 172.0.0.3:d' /usr/local/etc/racoon/racoon.conf`
echo $?

Es sollte ein Textblock zwischen den beiden Mustern gelöscht werden.

Das Problem besteht darin, dass der Befehl sed funktioniert, wenn ich ihn direkt von der Shell aus ausführe. Wenn ich jedoch das Skript ausführe, lautet der Rückgabecode 0.

Warum ist das?

Antwort1

Sie müssen die Backticks entfernen und die einfachen Anführungszeichen in doppelte Anführungszeichen ändern:

#!/bin/sh
ip=$1
echo $ip
sed -i .bak "\:#start ${ip}:,\:#end ${ip}:d" /usr/local/etc/racoon/racoon.conf

Durch die Verwendung von doppelten Anführungszeichen können die Variablen erweitert werden. Die Backticks würden versuchen, die Standardausgabe des Befehls auszuführen (die in diesem Fall nicht vorhanden ist). Wenn Sie `echo hi`dies beispielsweise tun würden, würde versucht, „hi“ als Befehl auszuführen. sedGibt immer 0 zurück, sofern kein Fehler vorliegt, unabhängig davon, ob ein Ersatz vorgenommen wurde.

Antwort2

Die Backticks sind wirklich nicht nötig (oder ich verstehe dich vielleicht falsch). Dass das Skript 0 zurückgibt, ist auch zu erwarten: Exitcode 0 ist OK. Edit: sed wird immer mit 0 beendet, auch wenn keine Ersetzung erfolgt ist. Nur wenn in deiner Syntax ein Fehler ist, wird ein anderer Exitcode generiert.

Interessanter ist: Wird der Code gelöscht oder nicht?

Ihren Kommentaren zufolge liegt vermutlich ein Problem mit dem regulären Ausdruck und/oder den darin enthaltenen Escape-Zeichen vor.

verwandte Informationen