Ich stelle ein einfaches Backup-Skript zusammen, das den Inhalt eines Ordners tarnt und die Datei dann auf einen Backup-Server verschiebt. Das Skript stellt sicher, dass die Tar-Datei existiert und nicht null Bytes groß ist, bevor es verschoben wird.
Das Problem ist, dass das Skript in einer der IF-Zeilen abstürzt.
if [ -f /www/archives/pdf/pdf_201207021048.tar && 11294720 -gt 0 ]; then
echo "tar file exists and is greater than 0 bytes."
else
echo "tar file does not exist or is zero bytes"
fi
Der Fehler in der Konsole ist:
./backup_pdf.sh: line 49: [: missing `]'
Zeile 49 ist die obige if-Anweisung.
Das Skript wurde erfolgreich verifiziert mit
sh -n backup.sh
Was ist falsch daran, dass sh
ein „]“ fehlt, die Syntaxprüfung jedoch trotzdem bestanden wird?
Antwort1
Das Problem besteht darin, dass &&
kein gültiger Operator für ist . Stattdessen [
wird oder benötigt .-a
[ condition ] && [ other_condition ]
&&
ist einSeparator(wie ;
, ||
, &
und \n
) in einer POSIX-Shell. Es sieht die Anweisung [ -f www/archives/pdf/pdf_201207021048.tar
; die Anweisung endet, weil ein vorkommt &&
, dann kommt eine weitere Anweisung (die ebenfalls einen Fehler verursachen würde, wenn sie dort ankäme), die wie aussieht 11294720 -gt 0 ]
, und diese Anweisung wird mit beendet ;
.