# 4.13 पहिली shell script

Source: https://ravindrabagale.com/mr/aws/ch04-linux-advanced-commands/4-13-basic-shell-scripting.html
Language: mr (Marathi with English technical terms)

ओळखीचे commands file मध्ये क्रमाने लिहिले की shell script तयार होते. Automation आणि पुढच्या EC2 user data साठी हा पाया. Mauli Dairy server चा छोटा health report करू:

#!/bin/bash
# file: sysinfo.sh  - print a quick health report
set -uo pipefail         # stop on undefined variables and pipe failures

NAME=$(hostname)
echo "Health report for $NAME at $(date)"
echo "---------------------------------"
echo "Uptime : $(uptime -p)"
echo "Disk / : $(df -h / | awk 'NR==2 {print $5 " used"}')"
echo "Memory : $(free -m | awk '/Mem/ {printf "%d/%d MB used", $3, $2}')"

# if-else
if systemctl is-active --quiet nginx; then
  echo "Nginx  : running"
else
  echo "Nginx  : NOT running"
fi

# loop
for svc in sshd crond; do
  echo "$svc -> $(systemctl is-active $svc 2>/dev/null)"
done

# function with argument
check_port() {
  if ss -tln | grep -q ":$1 "; then echo "Port $1 open"; else echo "Port $1 closed"; fi
}
check_port 22
check_port 80

Code मधली नोंद स्पष्ट करूया: set -uo pipefail मध्ये -u unset variables पकडतो आणि pipefail pipeline चा failure status जपतो. तो प्रत्येक failed command वर script आपोआप थांबवतो असा अर्थ नाही; त्यासाठी -e चं वेगळं, काळजीपूर्वक वर्तन समजून घ्यावं लागतं. check_port local listening socket पाहतो; internet firewall access सिद्ध करत नाही.

nano sysinfo.sh        # paste the script, save with Ctrl+O, exit with Ctrl+X
chmod +x sysinfo.sh
./sysinfo.sh

 | Concept | Syntax

 | Variable | NAME="Asha"; $NAME किंवा ${NAME}; = भोवती spaces नको

 | Command output | TODAY=$(date +%F)

 | Arguments | $1, $2; सर्व $@; संख्या $#

 | मागचा exit status | $?; 0 म्हणजे success

 | File आहे का? | if [ -f /etc/nginx/nginx.conf ]; then ... fi

 | Directory test | [ -d /var/www ]

 | संख्या compare | [ "$a" -gt 10 ]; -eq -ne -lt -le -ge

 | String compare | [ "$a" = "yes" ]

 | Input | read -p "Enter name: " NAME

Service names distro नुसार बदला: Ubuntu मध्ये ssh/cron आणि इतरत्र sshd/crond असू शकतात.

Lab

sysinfo.sh run करा. check_port 443 आणि check_port 3306 जोडा. मग backup.sh लिहा जो ~/backups/web-$(date +%F).tar.gz तयार करेल. ./backup.sh नंतर ls ~/backups तपासा.

रवींद्र बागले यांची tip

Windows CRLF मुळे bad interpreter आला तर sed -i 's/$//' script.sh ने line endings दुरुस्त करता येतात; backup आधी ठेवा. Nano मध्ये थेट लिहा आणि chmod +x विसरू नका.
