Bash (Bourne Again Shell) to język skryptowy wbudowany w każdy system Linux. Nawet podstawowe skrypty oszczędzają godziny ręcznej pracy. W tym artykule pokazujemy kilka gotowych, praktycznych skryptów z wyjaśnieniem każdego elementu.
#!/bin/bash
# Pierwsza linia: shebang – mówi systemowi że to skrypt Bash
# Zmienne (bez spacji wokół '=')
KATALOG="/home/pi/projekty"
PLIK="backup.tar.gz"
DZISIAJ=$(date +%Y-%m-%d) # $() podstawia wynik komendy
# Warunek
if [ -d "$KATALOG" ]; then
echo "Katalog istnieje"
else
echo "Brak katalogu"
fi
# Pętla for
for f in /home/pi/*.log; do
echo "Znaleziono: $f"
done
# Funkcja
przywitaj() {
local imie="$1"
echo "Cześć, $imie!"
}
przywitaj "Arduino"
chmod +x skrypt.sh#!/bin/bash
# backup.sh – tworzy kopię katalogu i usuwa stare backupy
ZRODLO="/home/pi/projekty"
CEL="/mnt/nas/backupy"
DATA=$(date +%Y%m%d_%H%M%S)
PLIK="backup_${DATA}.tar.gz"
ILE_ZACHOWAC=7 # liczba kopii do zachowania
mkdir -p "$CEL"
tar -czf "${CEL}/${PLIK}" "$ZRODLO" 2>/dev/null
echo "$(date): Backup $PLIK utworzony ($(du -sh ${CEL}/${PLIK} | cut -f1))"
# Usuń stare kopie (zostaw tylko $ILE_ZACHOWAC najnowszych)
ls -t "$CEL"/backup_*.tar.gz 2>/dev/null | tail -n +$((ILE_ZACHOWAC+1)) | xargs -r rm --
echo "Stare kopie usunięte, zostało: $(ls $CEL/backup_*.tar.gz 2>/dev/null | wc -l)"
#!/bin/bash
# dysk_alert.sh – wysyła powiadomienie gdy dysk > 80%
PROG_ALARMOWY=80
EMAIL="admin@example.com"
df -h | grep "^/dev/" | while read linia; do
uzycie=$(echo $linia | awk '{print $5}' | tr -d '%')
partycja=$(echo $linia | awk '{print $1}')
if [ "$uzycie" -gt "$PROG_ALARMOWY" ]; then
komunikat="UWAGA: $partycja zajęta w ${uzycie}%"
echo "$komunikat"
# Opcjonalnie wyślij email (wymaga skonfigurowanego sendmail/mailutils)
# echo "$komunikat" | mail -s "Alert dysku" "$EMAIL"
# Lub przez Telegram Bot API:
# curl -s "https://api.telegram.org/botTOKEN/sendMessage?chat_id=ID&text=$komunikat"
fi
done
#!/bin/bash
# iot_monitor.sh – sprawdza czy urządzenia w sieci odpowiadają
declare -A URZADZENIA
URZADZENIA["ESP32-salon"]="192.168.1.101"
URZADZENIA["RPi-NAS"]="192.168.1.50"
URZADZENIA["Router"]="192.168.1.1"
LOG="/var/log/iot_status.log"
for nazwa in "${!URZADZENIA[@]}"; do
ip="${URZADZENIA[$nazwa]}"
if ping -c 1 -W 2 "$ip" &>/dev/null; then
status="OK"
else
status="BRAK ODPOWIEDZI"
echo "$(date): $nazwa ($ip) – $status" | tee -a "$LOG"
fi
echo "$(date +%H:%M:%S) $nazwa ($ip): $status"
done
#!/bin/bash
# czyszcz_logi.sh – usuwa logi starsze niż N dni
KATALOG_LOGOW="/var/log/mojaplikacja"
ILE_DNI=30
find "$KATALOG_LOGOW" -name "*.log" -mtime +$ILE_DNI -exec rm {} \;
echo "$(date): Usunięto logi starsze niż $ILE_DNI dni"
# Skompresuj logi z ostatniego tygodnia
find "$KATALOG_LOGOW" -name "*.log" -mtime +7 -not -name "*.gz" -exec gzip {} \;
echo "Skompresowano stare logi"
# Edytuj harmonogram dla bieżącego użytkownika
crontab -e
# Format: minuta godzina dzień miesiąc dzień_tygodnia komenda
# * = każdy, */5 = co 5, 0 = konkretna wartość
# Backup o 2:30 w nocy każdego dnia
30 2 * * * /home/pi/skrypty/backup.sh >> /var/log/backup.log 2>&1
# Monitor dysku co 15 minut
*/15 * * * * /home/pi/skrypty/dysk_alert.sh
# Sprawdzenie IoT co minutę
* * * * * /home/pi/skrypty/iot_monitor.sh >> /var/log/iot.log 2>&1
# Czyszczenie logów raz w tygodniu (niedziela o 3:00)
0 3 * * 0 /home/pi/skrypty/czyszcz_logi.sh
/usr/bin/python3 zamiast python3.# Uruchom z trybem debugowania (wyświetla każdą wykonywaną linię)
bash -x skrypt.sh
# Dodaj na początku skryptu
set -e # zatrzymaj przy błędzie
set -x # debuguj każdą linię
set -u # błąd gdy używasz niezadeklarowanej zmiennej