• Opret dig
  • Glemt adgangskode

User account menu

  • Artikler
  • Forside
  • Forum
  • Nyheder
  • Log ind
Hjem
LinuxIN.dk

Snak med

Opret dig!

Af peque | 19.10.2010 10:02

Bashscript problem!

Hjælp generelt
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:
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!

  • Log ind eller opret dig for at tilføje kommentarer

Kommentarer5

# 1

14 år 8 måneder siden

Permalink

Indsendt af lbm den 19. oktober 2010 kl. 10:24

Permalink

Måske du mangler at slutte

Måske du mangler at slutte en if sætning eller andet i scriptet et sted.
Har du prøvet at udskrive $DAY med echo inde fra scriptet for se om den udskriver det rigtigt.
  • Log ind eller opret dig for at tilføje kommentarer

# 2

14 år 8 måneder siden

Permalink

Indsendt af mrbrown79 den 19. oktober 2010 kl. 10:46

Permalink

Jeg kan ikke se nogen fejl i den første

Men du skal ikke bruge "-eq", når du sammenligner strenge.

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

  • Log ind eller opret dig for at tilføje kommentarer

# 3

14 år 8 måneder siden

Permalink

Indsendt af mrbrown79 den 19. oktober 2010 kl. 10:55

Permalink

man date

Tror du ikke du skal bruge:

DAY="`date +%d`"

istedet for


DAY="`date +%e`"

  • Log ind eller opret dig for at tilføje kommentarer

# 4

14 år 8 måneder siden

Permalink

Indsendt af minimee den 20. oktober 2010 kl. 10:08

Permalink

Brug crontab istedet.
lav to

Brug crontab istedet.

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.
  • Log ind eller opret dig for at tilføje kommentarer

# 5

14 år 8 måneder siden

Permalink

Indsendt af Anonym7 den 20. oktober 2010 kl. 12:38

Permalink

Du kan sagtens bruge -eq til

Du kan sagtens bruge -eq til at sammenligne strenge, virker i hvert fald fint med bash 4.1 (Arch)

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/

  • Log ind eller opret dig for at tilføje kommentarer

Svar søges

llumos Unix-operativsystem, 0
Den er go 0
14. februar = I Love Free Software Day 0
Lokal fil-deling - for de dovne. 0
Linux fra begynder til professionel af O'Reilly 0

Seneste aktivitet

PCLinuxOS 24
Gode anmeldelser Zorin OS 17.3 2
"Intet realistisk alternativ" - mig i r*ven 15
Nulstilling af adgangskode 3
Ingen Mint 5
Linux App Store Flathub når 3 milliarder downloads 2
Digitaliseringsministeriet sætter gang i pilotprojekt om digital suverænitet 3
Mest sikker webbrowser 5
Firefox 2
Privatbeskeder 7
Backup/synkronisering? 3
BigLinux 5
Chatgpt satire 1
Læsning af databasefil i Firefox 2
Vanilla OS 15
Pepsi Challenge 4
Linuxin er nu migreret til Drupal 11 13
Et Dansk alternativ til Facebook 18
Ekstern Blu-ray-brænder, der fungerer med PCLinuxOS 3
Københavns og Aarhus Kommune dropper MS 9

© 2025 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !