வழிகாட்டி

தொடக்கநிலையாளர்களுக்கான Bash ஸ்கிரிப்ட்: முதல் ஸ்கிரிப்ட், மாறிகள், நிபந்தனைகள், சுழல்கள், cron

புதுப்பிக்கப்பட்டது: · Skillaria.Top

Bash ஸ்கிரிப்ட் என்பது ஷெல் கட்டளைகள் அடங்கிய உரைக் கோப்பு. இது #!/bin/bash வரியுடன் தொடங்கும், chmod +x மூலம் இயக்க அனுமதி பெறும், ./script.sh என இயங்கும். ஸ்கிரிப்ட்களில் மாறிகள், $1 மற்றும் $2 அளவுருக்கள், if நிபந்தனைகள், for மற்றும் while சுழல்கள் பயன்படுகின்றன; திட்டமிட்ட இயக்கத்துக்கு crontab -e பயன்படுகிறது.

Bash ஸ்கிரிப்ட் என்பது சாதாரண உரைக் கோப்பு; அதில் நீங்கள் டெர்மினலில் ஒவ்வொன்றாக தட்டச்சு செய்யும் கட்டளைகள் இருக்கும். ஸ்கிரிப்ட் #!/bin/bash என்ற shebang வரியுடன் தொடங்கும், chmod +x மூலம் இயக்க அனுமதி பெறும், ./script.sh என இயங்கும். தொடக்கநிலையாளர்களுக்கான இந்த bash ஸ்கிரிப்ட் வழிகாட்டி முதல் வரியிலிருந்து திட்டமிட்ட இயக்கம் வரை விளக்குகிறது: மாறிகள், அளவுருக்கள், நிபந்தனைகள், சுழல்கள், பிழை கையாளுதல், cron.

ஒரு நிமிடத்தில் முதல் bash ஸ்கிரிப்ட்

எந்த எடிட்டரிலும் கோப்பை உருவாக்குங்கள், எடுத்துக்காட்டாக nano:

nano hello.sh
#!/bin/bash
# முதல் ஸ்கிரிப்ட்: வாழ்த்து மற்றும் கணினி பற்றிய சில தகவல்கள்
echo "வணக்கம், $USER!"
echo "இன்று: $(date +%Y-%m-%d)"
echo "நீங்கள் இங்கே உள்ளீர்கள்: $(pwd)"

சேமியுங்கள் (Ctrl+O, Enter, Ctrl+X), இயக்க அனுமதி கொடுங்கள், பின்னர் இயக்குங்கள்:

$ chmod +x hello.sh
$ ./hello.sh
வணக்கம், alice!
இன்று: 2026-10-12
நீங்கள் இங்கே உள்ளீர்கள்: /home/alice

# இல் தொடங்கும் வரிகள் கருத்துகள். $(கட்டளை) கட்டளையின் வெளியீட்டை நேரடியாக வரியில் செருகுகிறது.

Shebang: முதல் வரியின் பங்கு

#!/bin/bash வரி கோப்பை எந்த விளக்கி (interpreter) இயக்க வேண்டும் என்று அமைப்புக்குச் சொல்கிறது. அது இல்லையென்றால் கிடைக்கும் எந்த ஷெல்லும் இயக்கும்; சில அமைப்புகளில் /bin/sh bash அல்ல, எளிய dash — அங்கே சில அமைப்புகள் வேலை செய்யாது.

மற்றொரு பொதுவான வடிவம் #!/usr/bin/env bash: இது PATH-இல் bash-ஐத் தேடுகிறது, bash /bin-இல் இல்லாதபோது பயனுள்ளது.

ஸ்கிரிப்ட்டை எப்படி இயக்குவது, ஏன் ./

இரண்டு வழிகள் உள்ளன:

  • ./hello.sh — shebang மற்றும் x அனுமதி தேவை. ./ முன்னொட்டு கட்டாயம், ஏனெனில் தற்போதைய கோப்பகம் PATH-இல் இல்லை.
  • bash hello.sh — இயக்க அனுமதி தேவையில்லை, ஏனெனில் விளக்கி வெளிப்படையாகக் குறிப்பிடப்பட்டுள்ளது.

./ இல்லாமல் command not found, chmod +x இல்லாமல் Permission denied வந்தால் இந்த இரண்டு காரணங்களே. உங்கள் ஸ்கிரிப்ட்களை எங்கிருந்தும் பெயரால் அழைக்க, அவற்றை ~/bin அல்லது /usr/local/bin-இல் வையுங்கள்.

மாறிகள்

மாறி = இரு பக்கமும் இடைவெளி இல்லாமல் உருவாக்கப்படுகிறது, $ கொண்டு படிக்கப்படுகிறது:

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

echo "கோப்பு: ${dir}/${name}-${today}.tar.gz"

சுருள் அடைப்புக்குறிகள் மாறியின் பெயரை அதைச் சுற்றியுள்ள உரையிலிருந்து பிரிக்கின்றன. name = "backup" என்று இடைவெளியுடன் எழுதுவது தவறு: bash name என்ற கட்டளையை இயக்க முயலும்.

மேற்கோள் குறிகள் முக்கியம்

இரட்டை மேற்கோளுக்குள் மாறிகள் அவற்றின் மதிப்புடன் மாற்றப்படுகின்றன; ஒற்றை மேற்கோளுக்குள் மாற்றப்படுவதில்லை. மாறிகளை கிட்டத்தட்ட எப்போதும் இரட்டை மேற்கோளில் எழுதுங்கள், இல்லையென்றால் இடைவெளியுள்ள கோப்புப் பெயர் இரண்டு வாதங்களாகப் பிரிந்துவிடும்.

file="என் அறிக்கை.txt"
rm $file      # தவறு: "என்" மற்றும் "அறிக்கை.txt" ஆகியவற்றை நீக்க முயலும்
rm "$file"    # சரி
echo '$HOME'  # அப்படியே $HOME என்று காட்டும்
echo "$HOME"  # /home/alice என்று காட்டும்

சூழல் மாறிகள்

$HOME, $USER, $PATH போன்ற மாறிகளை அமைப்பு வழங்குகிறது. உங்கள் சொந்த மாறியை export மூலம் துணை செயல்முறைகளுக்கு அனுப்பலாம். நிரந்தர சூழல் அமைப்புகள் ~/.bashrc அல்லது ~/.profile-இல் வைக்கப்படுகின்றன.

ஸ்கிரிப்ட் அளவுருக்கள்

இயக்கும்போது கொடுக்கப்படும் மதிப்புகள் $1, $2 என்று கிடைக்கும்.

மாறிகொண்டிருப்பது
$0ஸ்கிரிப்ட்டின் பெயர்
$1, $2…முதல், இரண்டாவது அளவுரு
$#அளவுருக்களின் எண்ணிக்கை
"$@"எல்லா அளவுருக்களும் தனித்தனியாக
$?கடைசி கட்டளையின் வெளியேறு குறியீடு
$$இயங்கும் ஸ்கிரிப்ட்டின் PID
#!/bin/bash
echo "ஸ்கிரிப்ட் $0 பெற்றது $# அளவுரு(க்கள்)"
echo "முதலாவது: $1"
$ ./args.sh nginx 80
ஸ்கிரிப்ட் ./args.sh பெற்றது 2 அளவுரு(க்கள்)
முதலாவது: nginx

பயனரின் உள்ளீடு read கட்டளையால் படிக்கப்படுகிறது: read -p "பெயரை உள்ளிடுக: " name.

if நிபந்தனைகள்

ஒவ்வொரு கட்டளையும் ஒரு வெளியேறு குறியீட்டைத் தருகிறது: 0 என்றால் வெற்றி, மற்றவை தோல்வி. if அமைப்பு இந்தக் குறியீட்டைச் சோதிக்கிறது. ஒப்பீடுகளுக்கு [[ ... ]] பயன்படுகிறது; அடைப்புக்குறிக்குள் இடைவெளி கட்டாயம்.

#!/bin/bash
if [[ $# -eq 0 ]]; then
    echo "பயன்பாடு: $0 <கோப்பகம்>"
    exit 1
fi

if [[ -d "$1" ]]; then
    echo "கோப்பகம் $1 உள்ளது"
elif [[ -f "$1" ]]; then
    echo "$1 ஒரு கோப்பு, கோப்பகம் அல்ல"
else
    echo "$1 கிடைக்கவில்லை"
fi
சோதனைபொருள்
-f fileசாதாரணக் கோப்பு உள்ளது
-d dirகோப்பகம் உள்ளது
-e pathபாதை உள்ளது
-x fileகோப்பை இயக்கலாம்
-z "$var" / -n "$var"சரம் வெற்று / வெற்று அல்ல
"$a" == "$b", !=சர ஒப்பீடு
-eq -ne -lt -le -gt -geஎண் ஒப்பீடு

எந்தக் கட்டளையின் முடிவையும் நேரடியாகச் சோதிக்கலாம்:

if systemctl is-active --quiet nginx; then
    echo "nginx இயங்குகிறது"
else
    echo "nginx நின்றுவிட்டது"
fi

பல தேர்வுகளுக்கு case வசதியானது:

case "$1" in
    start)   echo "தொடங்குகிறது" ;;
    stop)    echo "நிறுத்துகிறது" ;;
    *)       echo "அறியப்படாத கட்டளை: $1"; exit 1 ;;
esac

for மற்றும் while சுழல்கள்

for: பட்டியலைச் சுழற்று

for host in web1 web2 db1; do
    echo "சரிபார்க்கிறது $host"
    ping -c 1 -W 1 "$host" > /dev/null && echo "  அடையக்கூடியது" || echo "  அடைய முடியவில்லை"
done

for file in /var/log/*.log; do
    echo "$file: $(wc -l < "$file") வரிகள்"
done

for i in {1..5}; do
    echo "முயற்சி $i"
done

while: நிபந்தனை உண்மையாக இருக்கும் வரை

உன்னதமான எடுத்துக்காட்டு கோப்பை வரி வரியாகப் படிப்பது:

while read -r user; do
    echo "பயனர்: $user"
done < users.txt

சேவை தயாராகும் வரை காத்திருப்பது:

count=0
until curl -sf http://localhost:8080/health > /dev/null; do
    count=$((count + 1))
    if [[ $count -ge 10 ]]; then
        echo "சேவை தொடங்கவில்லை"
        exit 1
    fi
    sleep 3
done
echo "சேவை தயார்"

bash-இல் கணிதம் இரட்டை அடைப்புக்குறியில் எழுதப்படுகிறது: $((a + b)). இது முழு எண்களுடன் மட்டுமே வேலை செய்யும்.

செயல்பாடுகள் (functions)

மீண்டும் மீண்டும் வரும் குறியீட்டை செயல்பாடுகளில் வையுங்கள். செயல்பாட்டுக்குள் அளவுருக்கள் அதே $1, $2; local மாறி வெளியே கசிவதைத் தடுக்கிறது.

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

log INFO "காப்புப் பிரதி தொடங்குகிறது"
log ERROR "வட்டில் இடம் இல்லை"

பிழை கையாளுதல்: set -euo pipefail

இயல்பாக bash தோல்வியடைந்த கட்டளைக்குப் பின்னும் தொடர்கிறது — அதனால் காப்புப் பிரதி ஸ்கிரிப்ட் எதையும் நகலெடுக்காமல் "வெற்றி" என்று முடியலாம். ஸ்கிரிப்ட்டின் தொடக்கத்தில் கடுமையான பயன்முறையைச் சேர்ப்பது வழக்கம்:

#!/bin/bash
set -euo pipefail
  • -e — முதல் பிழையிலேயே நிறுத்து.
  • -u — அறிவிக்கப்படாத மாறியைப் பயன்படுத்துவது பிழை (காலியான DIR-இல் rm -rf "$DIR/" ஆபத்திலிருந்து பாதுகாப்பு).
  • -o pipefail — குழாய்த்தொடரின் எந்தப் பகுதி தோல்வியடைந்தாலும் முழுத் தொடரும் தோல்வி.

பிழைதிருத்த, ஸ்கிரிப்ட்டை bash -x script.sh என இயக்குங்கள்: ஒவ்வொரு கட்டளையும் இயங்குவதற்கு முன் bash அதை அச்சிடும். இயக்குவதற்கு முன் பொதுவான தவறுகளைக் கண்டறிய shellcheck பயன்படுத்துங்கள்.

நடைமுறை எடுத்துக்காட்டு: காப்புப் பிரதி ஸ்கிரிப்ட்

#!/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 "காப்பகம் உருவாக்கப்பட்டது: $DST/site-$STAMP.tar.gz"

# KEEP_DAYS நாட்களுக்கு மேற்பட்ட காப்பகங்களை நீக்கு
find "$DST" -name "site-*.tar.gz" -mtime +"$KEEP_DAYS" -delete

${1:-/var/www} என்றால் "முதல் அளவுரு; அது இல்லையென்றால் /var/www". ஸ்கிரிப்ட்டை /usr/local/bin/backup-site.sh என்று சேமித்து இயக்கக்கூடியதாக்குங்கள்: sudo chmod +x /usr/local/bin/backup-site.sh.

திட்டமிட்ட இயக்கம்: cron

Cron என்பது நேர அட்டவணைப்படி கட்டளைகளை இயக்கும் சேவை. பயனரின் பணிகளை crontab -e மூலம் திருத்தலாம், crontab -l மூலம் பார்க்கலாம்; root-இன் பணிகளுக்கு sudo crontab -e.

ஒரு பணி வரி ஐந்து நேரப் புலங்களையும் கட்டளையையும் கொண்டது:

# நிமிடம் மணி மாதத்தின்_நாள் மாதம் வாரத்தின்_நாள் கட்டளை
30 2 * * * /usr/local/bin/backup-site.sh >> /var/log/backup.log 2>&1
அட்டவணைஎப்போது இயங்கும்
*/5 * * * *ஒவ்வொரு 5 நிமிடங்களுக்கும்
0 * * * *ஒவ்வொரு மணி நேரத்தின் தொடக்கத்திலும்
30 2 * * *ஒவ்வொரு நாளும் 02:30-க்கு
0 9 * * 1-5வேலை நாட்களில் 09:00-க்கு
0 3 1 * *ஒவ்வொரு மாதம் 1-ஆம் தேதி 03:00-க்கு
@rebootதுவக்கத்துக்குப் பின் ஒருமுறை

கைமுறையாக வேலை செய்யும் ஸ்கிரிப்ட் cron-இல் ஏன் வேலை செய்வதில்லை

  • வேறு சூழல். Cron குறைந்தபட்ச PATH மற்றும் ~/.bashrc இல்லாமல் பணிகளை இயக்குகிறது. கட்டளைகளுக்கும் கோப்புகளுக்கும் முழுப் பாதைகளை எழுதுங்கள், அல்லது crontab-இன் தொடக்கத்தில் PATH-ஐ அமையுங்கள்.
  • வேறு வேலை கோப்பகம். பணி முகப்புக் கோப்பகத்திலிருந்து தொடங்குகிறது, ஸ்கிரிப்ட் இருக்கும் இடத்திலிருந்து அல்ல. முழுப் பாதைகளைப் பயன்படுத்துங்கள்.
  • % குறி. crontab-இல் % என்றால் புதிய வரி; அதனால் பணி வரியில் நேரடியாக date +%F எழுதினால் \% என்று எழுத வேண்டும். கட்டளையை ஸ்கிரிப்ட்டுக்குள் நகர்த்துவது எளிது.
  • வெளியீடு இழக்கப்படுகிறது. வெளியீட்டை பதிவுக் கோப்புக்கு திருப்புங்கள் (>> கோப்பு 2>&1), இல்லையென்றால் பிழை தெரியாது. Cron இயக்கங்களை journalctl -u cron மூலம் பார்க்கலாம் (RHEL குடும்பத்தில் சேவையின் பெயர் crond).

systemd உள்ள அமைப்புகளில் systemd timer cron-க்கு மாற்று: அதன் வெளியீடு journal-இல் சேரும், தவறிய இயக்கங்களை ஈடுசெய்யலாம்.

சுருக்கம்

தொடக்கநிலை bash ஸ்கிரிப்ட் என்பது #!/bin/bash shebang, இயக்க அனுமதி, கட்டளைகளின் வரிசை. மேற்கோளிட்ட மாறிகள், if மூலம் அளவுரு சரிபார்ப்பு, for மற்றும் while சுழல்கள், set -euo pipefail கடுமையான பயன்முறை ஆகியவற்றைச் சேர்த்தால் நம்பகமான தானியக்கக் கருவி கிடைக்கும்; அதை cron திட்டமிட்ட நேரத்தில் இயக்கும். Bash ஸ்கிரிப்ட்கள், சூழல், cron ஆகியவை லினக்ஸ் பாடநெறியில் நடைமுறையுடன் கற்பிக்கப்படுகின்றன.

அடிக்கடி கேட்கப்படும் கேள்விகள்

bash-க்கும் sh-க்கும் என்ன வேறுபாடு?

sh என்பது தரநிலை POSIX ஷெல்; bash அதன் விரிவாக்கப்பட்ட பதிப்பு — அணிகள், இரட்டை அடைப்புக்குறிகள் போன்ற வசதிகள் கொண்டது. bash கட்டமைப்புகளைப் பயன்படுத்தும் ஸ்கிரிப்ட்டை bash மூலமே இயக்க வேண்டும், sh மூலம் அல்ல.

bash ஸ்கிரிப்ட்டுக்கு என்ன நீட்சி (extension) இருக்க வேண்டும்?

லினக்ஸ் நீட்சியைப் பார்ப்பதில்லை; விளக்கி shebang மூலம் தீர்மானிக்கப்படுகிறது. .sh என்பது மனிதர்களுக்கு ஸ்கிரிப்ட் என்று தெரிவிக்கும் மரபு மட்டுமே.

ஸ்கிரிப்ட்டுக்கு கடவுச்சொல்லை பாதுகாப்பாக எப்படி கொடுப்பது?

அளவுருவாகக் கொடுக்காதீர்கள் — ps மூலம் மற்ற பயனர்கள் அளவுருக்களைப் பார்க்கலாம். 600 அனுமதி கொண்ட கோப்பிலிருந்து சூழல் மாறியைப் பயன்படுத்துங்கள், அல்லது காட்டாமல் உள்ளீடு பெற read -s பயன்படுத்துங்கள்.

ஸ்கிரிப்ட் root ஆக இயங்குகிறதா என்று எப்படிச் சரிபார்ப்பது?

பயனர் ID-ஐ பூஜ்யத்துடன் ஒப்பிடுங்கள்: if [[ $EUID -ne 0 ]]; then echo "root தேவை"; exit 1; fi.

SSH-இலிருந்து வெளியேறிய பிறகும் ஸ்கிரிப்ட் நிற்காமல் இருக்க பின்னணியில் எப்படி இயக்குவது?

nohup ./script.sh & பயன்படுத்துங்கள், அல்லது tmux அல்லது screen அமர்வில் இயக்குங்கள்; நிரந்தர பயன்பாட்டுக்கு ஸ்கிரிப்ட்டை systemd சேவையாக மாற்றுங்கள்.

இந்தத் தலைப்பை வீடியோவில் கற்றுக்கொள்ளுங்கள்

“Linux: с нуля до уверенного администрирования” பாடநெறியில் இந்தத் தலைப்பு பயிற்சியுடன் விரிவாக விளக்கப்பட்டுள்ளது.

பாடநெறிக்குச் செல்