Mwongozo

Skripti ya bash kwa wanaoanza: skripti ya kwanza, vigezo, masharti, mizunguko na cron

Imesasishwa: · Skillaria.Top

Skripti ya bash ni faili la maandishi lenye amri za shell, linaloanza na mstari wa shebang #!/bin/bash, linapewa ruhusa ya kutekeleza kwa chmod +x, kisha huendeshwa kama ./script.sh. Skripti hutumia vigezo, hoja $1 na $2, masharti if, mizunguko for na while, na uendeshaji wa kila mara kwa ratiba husanidiwa kwa crontab -e.

Skripti ya bash ni faili la kawaida la maandishi lenye amri ambazo kwa kawaida ungeziandika moja moja kwenye terminal. Skripti huanza na mstari wa shebang #!/bin/bash, hupewa ruhusa ya kutekeleza kwa chmod +x, na huendeshwa kama ./script.sh. Mwongozo huu wa skripti ya bash kwa wanaoanza unaelezea kuanzia mstari wa kwanza hadi uendeshaji kwa ratiba: vigezo, hoja, masharti, mizunguko, kushughulikia makosa, na cron.

Skripti ya kwanza ya bash ndani ya dakika moja

Tengeneza faili kwa kihariri chochote, kwa mfano nano:

nano hello.sh
#!/bin/bash
# Skripti ya kwanza: salamu na taarifa kidogo za mfumo
echo "Habari, $USER!"
echo "Leo ni: $(date +%Y-%m-%d)"
echo "Upo kwenye: $(pwd)"

Hifadhi (Ctrl+O, Enter, Ctrl+X), mpe ruhusa ya kutekeleza, kisha iendeshe:

$ chmod +x hello.sh
$ ./hello.sh
Habari, alice!
Leo ni: 2026-10-12
Upo kwenye: /home/alice

Mistari inayoanza na # ni maoni. $(amri) huweka matokeo ya amri moja kwa moja ndani ya mstari.

Shebang: kwa nini mstari wa kwanza upo

Mstari #!/bin/bash unaiambia mfumo ni interpreter gani itekeleze faili. Bila huo, skripti itaendeshwa na shell yoyote iliyopo, na kwenye baadhi ya mifumo /bin/sh si bash bali dash, rahisi zaidi, ambapo baadhi ya miundo haifanyi kazi.

Toleo jingine la kawaida ni #!/usr/bin/env bash: hutafuta bash kwenye PATH, jambo linalofaa ikiwa bash haipo kwenye /bin.

Jinsi ya kuendesha skripti, na kwa nini ./

Kuna njia mbili:

  • ./hello.sh — inahitaji shebang na ruhusa x. Kiambishi ./ ni lazima, kwa sababu saraka ya sasa haimo kwenye PATH.
  • bash hello.sh — hakuna haja ya ruhusa ya kutekeleza, kwa sababu interpreter imeandikwa wazi.

Ukiona command not found bila ./, na Permission denied bila chmod +x, hizo ndizo sababu mbili. Ili kuita skripti zako kwa jina kutoka mahali popote, ziweke kwenye ~/bin au /usr/local/bin.

Vigezo

Kigezo kinawekwa bila nafasi karibu na =, na kinasomwa kwa $:

#!/bin/bash
name="backup"
dir="/var/backups"
today=$(date +%F)

echo "Faili: ${dir}/${name}-${today}.tar.gz"

Mabano ya mkunjo yanatenganisha jina la kigezo na maandishi yanayokizunguka. Kuandika name = "backup" na nafasi ni kosa: bash itajaribu kuendesha amri inayoitwa name.

Alama za nukuu zina umuhimu

Ndani ya nukuu mbili vigezo hubadilishwa na thamani zake, ndani ya nukuu moja hazibadilishwi. Karibu kila mara andika vigezo ndani ya nukuu mbili, kwa sababu jina la faili lenye nafasi litagawanyika kuwa hoja mbili.

file="ripoti yangu.txt"
rm $file      # kosa: itajaribu kufuta "ripoti" na "yangu.txt"
rm "$file"    # sahihi
echo '$HOME'  # itaonyesha maneno $HOME kama yalivyo
echo "$HOME"  # itaonyesha /home/alice

Vigezo vya mazingira

Vigezo kama $HOME, $USER na $PATH vinatolewa na mfumo. Kigezo chako mwenyewe kinaweza kupelekwa kwa michakato ya ndani kwa export. Mipangilio ya kudumu ya mazingira huwekwa kwenye ~/.bashrc au ~/.profile.

Hoja za skripti

Thamani zinazotolewa wakati wa kuendesha skripti zinapatikana kama $1, $2, na kadhalika.

KigezoKinachoshikilia
$0jina la skripti
$1, $2…hoja ya kwanza, ya pili
$#idadi ya hoja
"$@"hoja zote, moja moja
$?msimbo wa kumaliza wa amri ya mwisho
$$PID ya skripti inayoendesha
#!/bin/bash
echo "Skripti $0 imepokea hoja $# "
echo "Ya kwanza: $1"
$ ./args.sh nginx 80
Skripti ./args.sh imepokea hoja 2
Ya kwanza: nginx

Ingizo kutoka kwa mtumiaji linasomwa kwa amri read: read -p "Weka jina: " name.

Masharti if

Kila amri hurudisha msimbo wa kumaliza: 0 inamaanisha imefanikiwa, nyingine yoyote ni kosa. Muundo wa if hukagua msimbo huo. Kwa kulinganisha hutumika [[ ... ]], na nafasi ndani ya mabano ni lazima.

#!/bin/bash
if [[ $# -eq 0 ]]; then
    echo "Matumizi: $0 <saraka>"
    exit 1
fi

if [[ -d "$1" ]]; then
    echo "Saraka $1 ipo"
elif [[ -f "$1" ]]; then
    echo "$1 ni faili, si saraka"
else
    echo "$1 haijapatikana"
fi
UkaguziMaana yake
-f filefaili la kawaida lipo
-d dirsaraka ipo
-e pathnjia ipo
-x filefaili linaweza kutekelezwa
-z "$var" / -n "$var"mfuatano ni tupu / si tupu
"$a" == "$b", !=kulinganisha mifuatano
-eq -ne -lt -le -gt -gekulinganisha namba

Unaweza pia kukagua matokeo ya amri moja kwa moja:

if systemctl is-active --quiet nginx; then
    echo "nginx inafanya kazi"
else
    echo "nginx imesimama"
fi

Kwa chaguzi nyingi, case ni nadhifu zaidi:

case "$1" in
    start)   echo "Inaanzisha" ;;
    stop)    echo "Inasimamisha" ;;
    *)       echo "Amri isiyojulikana: $1"; exit 1 ;;
esac

Mizunguko for na while

for: kupitia orodha

for host in web1 web2 db1; do
    echo "Ninakagua $host"
    ping -c 1 -W 1 "$host" > /dev/null && echo "  inafikika" || echo "  haifikiki"
done

for file in /var/log/*.log; do
    echo "$file: mistari $(wc -l < "$file")"
done

for i in {1..5}; do
    echo "Jaribio $i"
done

while: wakati sharti ni kweli

Mfano wa kawaida ni kusoma faili mstari kwa mstari:

while read -r user; do
    echo "Mtumiaji: $user"
done < users.txt

Na kusubiri huduma iwe tayari:

count=0
until curl -sf http://localhost:8080/health > /dev/null; do
    count=$((count + 1))
    if [[ $count -ge 10 ]]; then
        echo "Huduma haikuinuka"
        exit 1
    fi
    sleep 3
done
echo "Huduma iko tayari"

Hesabu katika bash huandikwa ndani ya mabano mawili: $((a + b)). Inafanya kazi kwa namba kamili pekee.

Kazi (functions)

Msimbo unaorudiwa hutengwa kwenye kazi. Hoja ndani ya kazi ni zile zile $1, $2, huku local ikizuia kigezo kutoka nje ya kazi.

log() {
    local level="$1"; shift
    echo "$(date '+%F %T') [$level] $*"
}

log INFO "Ninaanza kuhifadhi nakala"
log ERROR "Diski imejaa"

Kushughulikia makosa: set -euo pipefail

Kwa chaguo-msingi bash huendelea kutekeleza baada ya amri iliyoshindwa — kwa hiyo skripti ya nakala inaweza kumaliza "kwa mafanikio" bila kunakili chochote. Mwanzoni mwa skripti ni desturi kuongeza hali ya ukali:

#!/bin/bash
set -euo pipefail
  • -e — kusimama kwenye kosa la kwanza.
  • -u — kutumia kigezo ambacho hakijafafanuliwa ni kosa (inalinda dhidi ya rm -rf "$DIR/" wakati DIR ni tupu).
  • -o pipefail — mnyororo unachukuliwa kuwa umeshindwa ikiwa sehemu yoyote imeshindwa.

Kwa kurekebisha makosa, endesha skripti kwa bash -x script.sh: bash itachapisha kila amri kabla ya kuitekeleza. Ili kupata makosa ya kawaida kabla ya kuendesha, tumia shellcheck.

Mfano wa vitendo: skripti ya nakala rudufu

#!/bin/bash
set -euo pipefail

SRC="${1:-/var/www}"
DST="/var/backups/site"
KEEP_DAYS=7
STAMP=$(date +%F_%H-%M)

mkdir -p "$DST"
tar -czf "$DST/site-$STAMP.tar.gz" -C "$(dirname "$SRC")" "$(basename "$SRC")"
echo "Kumbukumbu imeundwa: $DST/site-$STAMP.tar.gz"

# futa kumbukumbu zilizo na umri wa zaidi ya KEEP_DAYS siku
find "$DST" -name "site-*.tar.gz" -mtime +"$KEEP_DAYS" -delete

Muundo ${1:-/var/www} unamaanisha "hoja ya kwanza, na ikikosekana — /var/www". Hifadhi skripti kama /usr/local/bin/backup-site.sh na uifanye itekelezeke: sudo chmod +x /usr/local/bin/backup-site.sh.

Uendeshaji kwa ratiba: cron

Cron ni huduma inayoendesha amri kwa ratiba. Kazi za mtumiaji huhaririwa kwa crontab -e, zinaonekana kwa crontab -l, na za root kwa sudo crontab -e.

Mstari mmoja wa kazi una sehemu tano za wakati na amri:

# dakika saa siku_ya_mwezi mwezi siku_ya_wiki amri
30 2 * * * /usr/local/bin/backup-site.sh >> /var/log/backup.log 2>&1
RatibaWakati inapoendeshwa
*/5 * * * *kila dakika 5
0 * * * *mwanzoni mwa kila saa
30 2 * * *kila siku saa 02:30
0 9 * * 1-5siku za kazi saa 09:00
0 3 1 * *tarehe 1 ya kila mwezi saa 03:00
@rebootmara moja baada ya kuwasha

Kwa nini skripti inafanya kazi ukiiendesha mkono lakini si kwenye cron

  • Mazingira tofauti. Cron huendesha kazi kwa PATH finyu na bila ~/.bashrc. Andika njia kamili za amri na faili, au weka PATH mwanzoni mwa crontab.
  • Saraka tofauti ya kazi. Kazi huanza kwenye saraka ya nyumbani, si mahali skripti ilipo. Tumia njia kamili.
  • Alama %. Kwenye crontab, % inamaanisha mstari mpya, kwa hiyo date +%F moja kwa moja kwenye mstari wa kazi lazima iandikwe \%. Ni rahisi zaidi kuhamisha amri hiyo ndani ya skripti.
  • Matokeo yanapotea. Elekeza matokeo kwenye kumbukumbu (>> faili 2>&1), vinginevyo kosa halitaonekana. Utekelezaji wa cron unaonekana kwenye journalctl -u cron (kwenye mifumo ya RHEL huduma inaitwa crond).

Kwenye mifumo yenye systemd, timers za systemd ni mbadala wa cron: matokeo huingia kwenye journal na kazi zilizokosekana zinaweza kufidiwa.

Muhtasari

Skripti ya bash kwa wanaoanza ni faili lenye shebang #!/bin/bash, ruhusa ya kutekeleza, na mfuatano wa amri. Ongeza vigezo ndani ya nukuu, ukaguzi wa hoja kwa if, mizunguko for na while, na hali kali set -euo pipefail — utapata zana ya otomatiki inayotegemewa, ambayo cron inaweza kuiendesha kwa ratiba. Skripti za bash, mazingira na cron vinafundishwa kwa vitendo katika kozi ya Linux.

Maswali ya mara kwa mara

Bash inatofautianaje na sh?

sh ni shell ya kawaida ya POSIX, wakati bash ni toleo lililoongezwa lenye arrays, mabano mawili na vipengele vingine. Skripti yenye miundo ya bash lazima iendeshwe kwa bash, si sh.

Skripti ya bash inapaswa kuwa na kiendelezi gani?

Linux haijali kiendelezi; interpreter inaamuliwa na shebang. Kiendelezi .sh ni desturi tu, ili binadamu ajue kwamba ni skripti.

Nitapitishaje nywila kwenye skripti kwa usalama?

Usiipitishe kama hoja, kwa sababu hoja zinaonekana kwa watumiaji wengine kupitia ps. Tumia kigezo cha mazingira kutoka faili lenye ruhusa 600, au read -s kwa kuingiza bila kuonyesha.

Nitajuaje kama skripti imeendeshwa na root?

Linganisha kitambulisho cha mtumiaji na sifuri: if [[ $EUID -ne 0 ]]; then echo "Inahitaji root"; exit 1; fi.

Nitaendeshaje skripti chinichini isisimame baada ya kutoka SSH?

Tumia nohup ./script.sh &, kipindi cha tmux au screen, na kwa matumizi ya muda mrefu geuza skripti kuwa huduma ya systemd.

Jifunze mada hii kwa video

Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Linux: с нуля до уверенного администрирования”.

Nenda kwenye kozi