Bashscript problem!
Hey Gutter.
jeg sidder her og roder med et script som jeg gerne vil have til at gøre følgende:
1. tage backup af mine diverse maskiner hver nat af konkrete conf- filer, MySQL dumps mm. og dette fungerer kanon.
2. Men for sportens skyld ville jeg gerne have scriptet til i slutningen og vurdere hvilken dag i måneden det er - og er det den første - så skal der pakkes et tar-arkiv med disse filer.
Selve månedsdagen hiver jeg med følgende kommando:
og denne kommando fungerer .
I slutningen af mit backupscript ville jeg så enormt gerne have den til at vurdere day of month - og derefter køre følgende del:
Men der sker ikke noget. Heller ikke den skriver linien ud med mine kommentarer - der sker faktisk intet - bortset fra resten af scriptet kører.
Jeg har også prøvet den modsatte vej med flere muligheder:
Og i selve if-linien har jeg faktisk prøvet alle muligheder:
if [ $DAY == "01" ]
if [ $DAY == '01' ]
if [ $DAY == $BACKUP ] (hvor $BACKUP er sat til 01
Men uanset hvad - så køres den del af mit script ikke hvilket undrer mig gevaldigt!
sætter jeg Variablerne til at blive udskrevet efter FI - så er de allesammen korrekte med de korrekte værdier.
Såååååå ved iikke lige hvad jeg har gloet mig blind på -men ville da gerne lige have et los i den rigtige retning!
jeg sidder her og roder med et script som jeg gerne vil have til at gøre følgende:
1. tage backup af mine diverse maskiner hver nat af konkrete conf- filer, MySQL dumps mm. og dette fungerer kanon.
2. Men for sportens skyld ville jeg gerne have scriptet til i slutningen og vurdere hvilken dag i måneden det er - og er det den første - så skal der pakkes et tar-arkiv med disse filer.
Selve månedsdagen hiver jeg med følgende kommando:
DAY="`date +%e`"
og denne kommando fungerer .
I slutningen af mit backupscript ville jeg så enormt gerne have den til at vurdere day of month - og derefter køre følgende del:
if [ $DAY != "01" ];
then
echo " We are NOT performing a monthly backup today...." >> $LOGFILE
else
echo "Creating the Archive from all standard conf files" >> $LOGFILE
tar -cvvf Backup_$MONTH.tar /storage/* --exclude=/storage/atlantis/storage --exclude=/storage/core/music >> $LOGFILE
mv Backup_$MONTH.tar /root/
echo "Finished the Monthly backup - and stored the file in /root" >> $LOGFILE
fi
Men der sker ikke noget. Heller ikke den skriver linien ud med mine kommentarer - der sker faktisk intet - bortset fra resten af scriptet kører.
Jeg har også prøvet den modsatte vej med flere muligheder:
if [ $DAY -eq "01" ];
then
echo "Creating the Archive from all standard conf files" >> $LOGFILE
tar -cvvf Backup_$MONTH.tar /storage/* --exclude=/storage/atlantis/storage --exclude=/storage/core/music >> $LOGFILE
mv Backup_$MONTH.tar /root/
echo "Finished the Monthly backup - and stored the file in /root" >> $LOGFILE
else
echo " We are NOT performing a monthly backup today...." >> $LOGFILE
fi
Og i selve if-linien har jeg faktisk prøvet alle muligheder:
if [ $DAY == "01" ]
if [ $DAY == '01' ]
if [ $DAY == $BACKUP ] (hvor $BACKUP er sat til 01
Men uanset hvad - så køres den del af mit script ikke hvilket undrer mig gevaldigt!
sætter jeg Variablerne til at blive udskrevet efter FI - så er de allesammen korrekte med de korrekte værdier.
Såååååå ved iikke lige hvad jeg har gloet mig blind på -men ville da gerne lige have et los i den rigtige retning!
Kommentarer5
Måske du mangler at slutte
Har du prøvet at udskrive $DAY med echo inde fra scriptet for se om den udskriver det rigtigt.
Jeg kan ikke se nogen fejl i den første
Det her virker:
#!/bin/bash
DAY="`date +%e`"
if [ $DAY == "19" ];
then
echo "Idag er det d. 19"
else
echo "Idag er det IKKE d. 19"
fi
man date
DAY="`date +%d`"
istedet for
DAY="`date +%e`"
Brug crontab istedet.
lav to
lav to script, det første sætte du til at køre hverdag, det næste til at kører en gang om måneden.
Du kan sagtens bruge -eq til
Et par sh programmerings-tips:
1) Kør dine scripts som "sh -x SCRIPT" - det slår debugging output til . Det virker lidt som make hvor hver linje bliver udskrevet lige før den bliver kørt.
2) VID HVILKEN SHELL DU KOMMER TIL AT KØRE SCRIPTET I !!! --Fx vil du i Debian/Ubuntu komme ud for at mange system scripts rent faktisk startes med "dash" frem for "bash".
Hvorfor er det vigtigt ? Fordi shellscript syntaksen varierer mellem de forskellige implementationer af sh (og en hel del mere for de andre shells!) -- specielt bash har en hulens masse workarounds og kompatabilitetsfixes som ellers ikke vil virke i andre sh shells så som dash.
Speciel syntaks og features kun eksisterende i bash kaldes bashisms
ERGO: specificér explicit it dit script hvilken shell du ønsker og test med denne.
3) Gør som hvis du programmerede Python eller F# => benyt en shell til at teste tingene interaktivt! -- jeg gjorde fx dette for at kigge på dit eksempel med if-statements og fandt ud af at bash accepterer sammenligninger mellem strenge med -eq/=/== (jeg *mener* at '==' er tilføjet for kompatabilitetens skyld og at -eq oprindeligt er tiltænkt numre - så '=' burde være mest korrekt)
Afsluttende: Overvej en egentlig debugger:
http://bashdb.sourceforge.net/