PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Scp-Skript meldet Fehler



mr-sansibar
08-01-2008, 10:09
Hallo !
Ich habe ein skript geschrieben der von einem server auf den anderen server was transferiert.
aber komischerweise kommt hin und wieder eine Fehlermeldung:

(10 - 09: value too great for base (error token is "09")

nach mehrmaligen ausführen klappt es dann




#!/usr/bin/bash



tageszeit=$(TZ=$(date +%Z)+$((24*1 - ($(date +%H) - $(date -u +%H)) )) date +"%Y%m%d")
for d in /all_logs/logger/*; do
test -d "$d" || continue
echo $tageszeit
server1:/y/y/y/y/.
scp $d/*appl_logs*$tageszeit*.tar server2:/ora_x/x/x/x/.
done

meinereinerseiner
08-01-2008, 12:09
mal ne dumme frage, was tut denn:


tageszeit=$(TZ=$(date +%Z)+$((24*1 - ($(date +%H) - $(date -u +%H)) )) date +"%Y%m%d")


der tom

jan61
10-01-2008, 21:33
mal ne dumme frage, was tut denn:


tageszeit=$(TZ=$(date +%Z)+$((24*1 - ($(date +%H) - $(date -u +%H)) )) date +"%Y%m%d")der tom

Dumme Antwort: Probiers aus :rolleyes:

jan@jack:~/tmp> tageszeit=$(TZ=$(date +%Z)+$((24*1 - ($(date +%H) - $(date -u +%H)) )) date +"%Y%m%d")
jan@jack:~/tmp> echo $tageszeit
20080109
Und wenn Du die einzelnen Komponenten durchleuchten willst, dann probier die einfach auch aus:
jan@jack:~/tmp> echo $(date +%Z)
CET
Es liefert einfach ein Datum in der Form YYYYMMDD; dass der Aufruf etwas - hm - komplex aussieht, liegt wohl daran, dass die Zeitzone mit ausgewertet wird (TZ) und dabei berücksichtigt wird, dass die u. U. gar nicht gesetzt ist.

Jan

jan61
10-01-2008, 21:40
Moin,

da bin ich wieder mit meiner mittlerweile gebetsmühlenartig wiederholten Standardantwort: Setze ein "set -x" an den Scriptanfang und guck Dir an, welche Befehle Dein Script ausführt (wenn der Fehler nur sporadisch auftaucht, dann lass die Ausgabe in eine Datei schreiben und sichere die regelmäßig weg). Da ich weder die Struktur der bei Dir zu sichernden Verzeichnisse kenne noch irgendwelche Infos über Dein System (oder das Remote-System) habe, kann ich auch keine weiter gehenden Tipps geben.

Jan

meinereinerseiner
10-01-2008, 22:02
ich hatte es schon ausprobiert und war verwundert, das leztendlich erstmal lediglich nur das datum von gestern in $tageszeit stand. also nichts was ein

date --date 'yesterday' +"%Y%m%d"
nich auch kann, wenn man mal das mit der zeitzone überliest. :)

tom

jan61
10-01-2008, 22:28
...wenn man mal das mit der zeitzone überliest.

*ebfg* - ich mag diese bash-typischen $($XY=($AB?$(.... ja eigentlich auch nicht, ich finde nett entwertete Backticks so wie `echo $XYZ\`eval echo $\\\`echo \\\`\\\\\$ABC... viel hübscher und leichter zu lesen :cool:, aber TZ zum Anfang fiel mir gleich auf, weil ich mit dem Ding öfters zu kämpfen hatte. Ansonsten macht man's wie immer: Von innen nach außen durchwurschteln.

Jan

mr-sansibar
11-01-2008, 11:06
der fehler ist wenn ich Uhrzeit 10-09 machen klappt es nicht.
die null bei 09 ist die ursachen.
habt iht eine idee wie ich aus der aktuellen datum minus eins machen kann. das ergebnis soll so aus ddmmyyyy

vilen dank

jan61
11-01-2008, 18:23
der fehler ist wenn ich Uhrzeit 10-09 machen klappt es nicht.
die null bei 09 ist die ursachen.
habt iht eine idee wie ich aus der aktuellen datum minus eins machen kann. das ergebnis soll so aus ddmmyyyy

vilen dank

Hm, ich weiss immer noch nicht, an welcher Stelle des Scripts der Fehler auftritt. Aktuelles Datum - 1 Tag geht z. B. so:
jan@jack:~/tmp> date -d yesterday +%d%m%Y
10012008
Eine andere Syntax dafür hatte bereits meinereinerseiner gestern gepostet.

Jan

EDIT: Jetzt habe ich es mal durchprobiert und mir ist jetzt erst richtig klargeworden, was Du überhaupt vorhast mit der tageszeit=...-Zeile - Du willst die Variable TZ zusammenbauen und dann mit dieser Zeitzone das Datum bestimmen. Hm, ziemlich umständlich ;-)

Das Problem liegt darin, dass hier "$(date +%H) - $(date -u +%H)" eine Subtraktion durchgeführt wird und ein mit 0 beginnender numerischer Wert als Oktalzahl interpretiert wird - dem Zahlensystem gehen die Ziffern aber nun mal nach 7 aus, also bringen 08 und 09 genau diesen Fehler. Abhilfe: Statt "+%H" nimmst Du "+%k", das liefert einstellige Stunden auch einstellig aus. Und schon gehts (ich musste ein wenig tricksen, damit ich einstellige Stunden um diese Tageszeit erhalte):
jan@jack:~/tmp> echo $(($(date -d "-10 hours" +%H) - $(date -d "-10 hours" -u +%H)))
bash: 09: value too great for base (error token is "09")
jan@jack:~/tmp> echo $(($(date -d "-10 hours" +%k) - $(date -d "-10 hours" -u +%k)))
1
Nochmal ich: Um mal zu demonstrieren, wie schön ein "set -x" die Fehlersuche erleichtern kann:
jan@jack:~/tmp> cat tz.sh
#! /bin/bash
set -x
tageszeit=$(TZ=$(date +%Z)+$((24*1 - ($(date -d "-9 hours" +%H) - $(date -d "-9 hours" -u +%H)) )) date +"%Y%m%d")
echo $tageszeit
jan@jack:~/tmp> ./tz.sh
+++ date +%Z
+++ date -d '-9 hours' +%H
+++ date -d '-9 hours' -u +%H
./tz.sh: line 1: 24*1 - (10 - 09: value too great for base (error token is "09")
+ tageszeit=
+ echo
Man sieht also sofort, welche Befehle ausgeführt wurden und an welcher Stelle die Fehlermeldung kommt. Wenn man erstmal weiss, dass die Subtraktion 24*1 - (10 - 09) den Ärger macht, dann nimmt man sich genau diese Stelle raus aus dem Script und probiert sie systematisch mit allen möglichen Werten aus, also 10 - 09, 10 - 08, 10 - 07 - bingo! Das hat geklappt, hm - da war doch was mit der 7? *Licht angeh* - Oktalsystem! Dann muss man nur noch beherzt "man date" in die Tastatur klopfen und schon hat man eine Lösung. Mit geänderter date-Option sieht die Sache dann so aus:
jan@jack:~/tmp> cat tz.sh
#! /bin/bash
set -x
tageszeit=$(TZ=$(date +%Z)+$((24*1 - ($(date -d "-9 hours" +%k) - $(date -d "-9 hours" -u +%k)) )) date +"%Y%m%d")
echo $tageszeit
jan@jack:~/tmp> ./tz.sh
+++ date +%Z
+++ date -d '-9 hours' +%k
+++ date -d '-9 hours' -u +%k
++ TZ=CET+23
++ date +%Y%m%d
+ tageszeit=20080110
+ echo 20080110
20080110