Ha már régóta Linuxot használsz, biztosan előfordult, hogy ugyanazokat a parancsokat kellett begépelned újra és újra. Rendszerfrissítés, logfájlok takarítása, fontos mappák biztonsági mentése, lemezterület ellenőrzése — ezek mind olyan feladatok, amelyeket érdemes automatizálni. A Bash szkriptelés az a módszer, amellyel a tapasztalt Linux-felhasználók ideős spórolnak — és ez egyszrűbb mint gondolnád.
Ez az útmutató nem csak elmagyarázza, mi az a Bash — négy valóban hasznos szkriptet fogsz felépíteni nulláról, amelyek mindegyike egy valós problémát old meg. Az útmutató végére egy saját automatizálási eszközkészleted lesz, amelyet azonnal használhatsz.
Amire szükséged lesz
- Egy Linux rendszer Bash-sel (gyakorlatilag minden disztrón előre telepítve van)
- Alapszintű terminálismeret (tudod, hogyan kell
cd-zni,ls-ezni, parancsokat futtatni) - Egy szövegszerkesztő —
nano,vim, vagy akárgeditis megfelel
Mielőtt belevágnánk, ellenőrizd a Bash verziódat:
bash --version
A Bash 4.x-től felfelé minden rendben van. A legtöbb modern disztró már az 5.x sorozatot szállítja.
1. rész: Egy Bash szkript anatómiája
Mielőtt valami hasznosat írnánk, nézzük meg azt a három dolgot, amelyek minden Bash szkripthez kellenek.
1. A shebang sor
Minden szkript ezzel kezdődik az első sorban:
#!/bin/bash
Ez megmondja a rendszernek, hogy Bash-sel értelmezze a fájlt, függetlenül attól, éppen milyen shellt használsz.
2. Futtathatóvá tétel
A szkriptfájl csak egy szöveges fájl, amíg nem adsz neki futtatási jogosultságot:
chmod +x sajatszkript.sh
3. Futtatás
./sajatszkript.sh
Vagy bárhonnan, ha a ~/.local/bin/ mappába helyezed (amelynek alapértelmezés szerint benne kell lennie a $PATH-odban):
sajatszkript.sh
Most építsünk valami valódit.
1. szkript: Rendszerfrissítés és takarítás egy paranccsal
A probléma: Rendszeresen futtatod a sudo apt update && sudo apt upgrade -y parancsot, de elfelejted utána kitakarítani a régi csomagokat és a gyorsítótárat.
A megoldás: Egy szkript, amely elvégzi az egész munkát.
Hozz létre egy új fájlt:
nano ~/szkriptek/rendszer-frissites.sh
Másold bele ezt:
#!/bin/bash
echo "=== Rendszerfrissítés elkezdődött ==="
# Disztró felismerése és a megfelelő csomagkezelő használata
if command -v apt &> /dev/null; then
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y
sudo apt autoclean
elif command -v dnf &> /dev/null; then
sudo dnf upgrade -y
sudo dnf autoremove -y
elif command -v pacman &> /dev/null; then
sudo pacman -Syu --noconfirm
fi
echo ""
echo "=== Frissítés kész! ==="
echo "Lemezhasználat a takarítás után:"
df -h /
Tedd futtathatóvá és indítsd el:
chmod +x ~/szkriptek/rendszer-frissites.sh
./szkriptek/rendszer-frissites.sh
Mi történik itt?
- A
command -vellenőrzi, hogy egy adott program létezik-e — ez teszi a szkriptet kompatibilissé Debian-, Fedora- és Arch-alapú rendszerekkel egyaránt - A
&> /dev/nullelnémítja magának az ellenőrzésnek a kimenetét - A
df -h /megmutatja, mennyi helyet szabadítottál fel
2. szkript: Automatikus biztonsági mentés időbélyeggel
A probléma: Rendszeresen biztonsági mentést szeretnél készíteni egy fontos mappáról, de a kézi másolgatás felülírja a tegnapi mentést.
Hozd létre a szkriptet:
nano ~/szkriptek/mentes.sh
#!/bin/bash
# ---- Beállítások ----
FORRAS_MAPPA="$HOME/Dokumentumok"
MENTES_MAPPA="$HOME/Mentések"
# ---------------------
# Mentési mappa létrehozása, ha nem létezik
mkdir -p "$MENTES_MAPPA"
# Időbélyeg generálása: pl. 2026-05-03_14-30-00
IDOPELYEG=$(date +"%Y-%m-%d_%H-%M-%S")
MENTES_NEV="dokumentumok_mentes_$IDOPELYEG.tar.gz"
echo "Mentés folyamatban: $FORRAS_MAPPA..."
tar -czf "$MENTES_MAPPA/$MENTES_NEV" "$FORRAS_MAPPA"
if [ $? -eq 0 ]; then
echo "✓ Sikeres mentés: $MENTES_MAPPA/$MENTES_NEV"
echo " Méret: $(du -sh "$MENTES_MAPPA/$MENTES_NEV" | cut -f1)"
else
echo "✗ A mentés SIKERTELEN. Ellenőrizd a jogosultságokat és a szabad lemezhelyet."
exit 1
fi
# Opcionális: 7 napnál régebbi mentések törlése
# find "$MENTES_MAPPA" -name "*.tar.gz" -mtime +7 -delete
# echo "Régi mentések törölve."
Fontos fogalmak:
- A
$()parancshelyettesítés — egy parancs kimenetét változóba menti - A
$?az utolsó parancs kilépési kódja:0= sikeres, bármi más = hiba - A
tar -czftömörített (gzip) archívumot hoz létre - A takarítási sor alapértelmezés szerint ki van kommentelve — ha magabiztosan használod a szkriptet, távolítsd el a
#jelet
Módosítsd a FORRAS_MAPPA értékét a védeni kívánt mappára, majd futtasd:
chmod +x ~/szkriptek/mentes.sh
./szkriptek/mentes.sh
3. szkript: Lemezterület-figyelő riasztással
A probléma: A lemezed csendben megtelik, és csak akkor veszed észre, amikor valami elromlik.
Ez a szkript ellenőrzi a lemezhasználatot, és figyelmeztetést ír egy naplófájlba (valamint opcionálisan asztali értesítést küld), ha a használat átlép egy küszöbértéket.
nano ~/szkriptek/lemez-figyelő.sh
#!/bin/bash
KUSZOB=80
NAPLO_FAJL="$HOME/.lemez-figyelő.log"
PARTICIO="/"
# Aktuális használati százalék lekérése (%-jel nélkül)
HASZNALAT=$(df "$PARTICIO" | awk 'NR==2 {print $5}' | tr -d '%')
DATUM=$(date "+%Y-%m-%d %H:%M")
if [ "$HASZNALAT" -ge "$KUSZOB" ]; then
UZENET="[$DATUM] FIGYELMEZTETÉS: $PARTICIO ${HASZNALAT}%-on van!"
echo "$UZENET" | tee -a "$NAPLO_FAJL"
# Asztali értesítés (GNOME/KDE asztalokon működik)
if command -v notify-send &> /dev/null; then
notify-send "Lemezterület riasztás" "$PARTICIO teli van ${HASZNALAT}%-ban!" --urgency=critical
fi
else
echo "[$DATUM] OK: $PARTICIO ${HASZNALAT}% — biztonságos határon belül." >> "$NAPLO_FAJL"
fi
Futtasd kézzel először a teszteléshez:
chmod +x ~/szkriptek/lemez-figyelő.sh
./szkriptek/lemez-figyelő.sh
Majd ellenőrizd a naplót:
cat ~/.lemez-figyelő.log
A riasztás teszteléséhez ideiglenesen állítsd KUSZOB=1-re — a lemezed szinte biztosan több mint 1%-on van.
2. rész: Szkriptek ütemezése Cronnal
A szkriptek megírása csak a munka fele. Az igazi erő abban rejlik, hogy automatikusan futnak egy ütemterv szerint, a cron segítségével.
Nyisd meg a személyes crontab-fájlodat:
crontab -e
A cron szintaxisa a következő mintát követi:
* * * * * /elérési/út/a/szkripthez.sh
│ │ │ │ │
│ │ │ │ └── A hét napja (0=vasárnap, 6=szombat)
│ │ │ └──── Hónap (1–12)
│ │ └────── A hónap napja (1–31)
│ └──────── Óra (0–23)
└────────── Perc (0–59)
Íme néhány praktikus példa a három szkripthez:
# Rendszerfrissítés minden vasárnap hajnali 3-kor
0 3 * * 0 /home/felhasznaló/szkriptek/rendszer-frissites.sh >> /home/felhasznaló/naplók/frissites.log 2>&1
# Dokumentumok mentése minden nap este 11-kor
0 23 * * * /home/felhasznaló/szkriptek/mentes.sh >> /home/felhasznaló/naplók/mentes.log 2>&1
# Lemezterület ellenőrzése óránként
0 * * * * /home/felhasznaló/szkriptek/lemez-figyelő.sh
Fontos: A cron feladatok minimális környezetben futnak, a szokásos
$PATHnélkül. Mindig teljes elérési utakat használj a szkriptekhez és parancsokhoz. Afelhasznalóhelyére írd a saját felhasználóneved (ellenőrizd awhoamiparanccsal).
Hozd létre előbb a naplómappát:
mkdir -p ~/naplók
A crontab mentése után ellenőrizd, hogy regisztrálva van-e:
crontab -l
4. szkript: Git tárolók gyors állapotellenőrzője
A probléma: Több Git tárolóval dolgozol egyszerre, és mindig elfelejted, melyikben vannak nem commitolt változások.
nano ~/szkriptek/git-statusz.sh
#!/bin/bash
# Add meg a tároló elérési útjait
TÁROLÓK=(
"$HOME/projektek/weboldal"
"$HOME/projektek/dotfiles"
"$HOME/projektek/szkriptek"
)
echo "=== Git tárolók állapotellenőrzése ==="
echo ""
for TÁROLÓ in "${TÁROLÓK[@]}"; do
if [ -d "$TÁROLÓ/.git" ]; then
echo "📁 $TÁROLÓ"
cd "$TÁROLÓ"
# Nem commitolt változások ellenőrzése
if ! git diff-index --quiet HEAD --; then
echo " ⚠️ Nem commitolt változások vannak"
git status --short
else
echo " ✓ Tiszta"
fi
# Lemaradt-e a remote mögött?
git fetch --quiet 2>/dev/null
LEMARADT=$(git rev-list HEAD..@{u} --count 2>/dev/null)
if [ "$LEMARADT" -gt 0 ] 2>/dev/null; then
echo " ↓ $LEMARADT commit(tal) lemaradt a remote mögött"
fi
echo ""
else
echo "⚠️ $TÁROLÓ — nem Git tároló, vagy nem létezik"
echo ""
fi
done
Szerkeszd a TÁROLÓK tömböt a saját projektek elérési útjaira, majd:
chmod +x ~/szkriptek/git-statusz.sh
./szkriptek/git-statusz.sh
Szkriptek rendszerezése hosszú távra
Ahogy a gyűjteményed bővül, tartsd rendben a dolgokat:
mkdir -p ~/.local/bin
Helyezd a szkripteket ide, és a terminál bármely pontjáról elérhetők lesznek (feltéve, hogy a ~/.local/bin benne van a $PATH-odban, ami a legtöbb modern disztrón alapértelmezés szerint igaz).
mv ~/szkriptek/*.sh ~/.local/bin/
# A .sh kiterjesztés eltávolítása tisztább parancsokhoz
mv ~/.local/bin/rendszer-frissites.sh ~/.local/bin/rendszer-frissites
chmod +x ~/.local/bin/rendszer-frissites
Mostantól bárhonnan begépelheted: rendszer-frissites.
Hibakeresési tippek
Ha egy szkript nem a várt módon működik, ez a két eszköz az első bevetésed:
1. Futtasd -x kapcsolóval a végrehajtás nyomkövetéséhez:
bash -x ./sajatszkript.sh
Ez minden parancsot kiír futtatás közben, a tényleges értékekkel helyettesítve. Felbecsülhetetlen értékű.
2. Adj hozzá set -e-t a szkript elejéhez:
#!/bin/bash
set -e
Ez azonnal kilépésre kényszeríti a szkriptet, ha bármely parancs hibával zárul, ahelyett, hogy csendben folytatná — és nehezen nyomozható problémákat hozna létre.
Mit próbálj ki ezután?
Ha már otthonosan mozogsz ezekben a mintákban, a logikus következő lépések:
- Függvények — kódblokkokat használhatsz újra egy szkripten belül ismétlés nélkül
- getopts — kapcsolókat és argumentumokat fogadhatsz el, ahogy az igazi Linux parancsok teszik (
sajatszkript -v -o kimenet.txt) - systemd timerek — egy robusztusabb, modern alternatíva a cronhoz ütemezett feladatokhoz
- flock — megakadályozza, hogy egy szkript egyszerre kétszer fusson, ami fontos az átfedő cron feladatoknál
A Bash szkriptelésnek híre van, hogy kriptikus, de ahogy itt is láthatod, az építőelemek aprók és olvashatók. Minden megírt szkript gyorsabbá teszi a következőt. Az igazi készség abban rejlik, hogy felismerd: melyik napi feladatod ér meg 30 perc automatizálást — és általában a válasz az: több, mint gondolnád.
Van egy feladat, amelyet automatizálnál, de nem tudod, hogyan kezdj hozzá? Írd meg a hozzászólásokban — minden kommentet elolvasunk.


Hozzászólások(0)