தொடக்கநிலையாளர்களுக்கான Bash ஸ்கிரிப்ட்: முதல் ஸ்கிரிப்ட், மாறிகள், நிபந்தனைகள், சுழல்கள், cron
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: с нуля до уверенного администрирования” பாடநெறியில் இந்தத் தலைப்பு பயிற்சியுடன் விரிவாக விளக்கப்பட்டுள்ளது.
- Bash-скрипты: от команды в терминале до рабочего скрипта автоматизации
- Пакеты, окружение и первая автоматизация: apt, профиль и cron