Ravindra BagaleCourses & study guides English

Linux Complete Interview Pack 2: Coding Exercises सह 150 Shell Scripting Interview प्रश्न आणि उत्तरं

हा chapter पूर्ण Shell Scripting interview pack आहे: beginner (50), mid level (50), senior (25) अशा 150 प्रश्नांची पूर्ण उत्तरं आणि पूर्ण चालणाऱ्या solutions सह 25 coding exercises. Variables, quoting, loops, functions, exit codes, set -euo pipefail, trap, getopts, grep, sed आणि awk ने text processing, आणि production script design याबद्दल interviewers सर्वात जास्त विचारतात ते प्रश्न शिकाल. प्रत्येक coding exercise script दाखवतो, म्हणजे तुम्ही type करू, चालवू आणि समजावू शकता.

या chapter मध्ये तुम्ही काय शिकाल

  • 50 beginner scripting प्रश्नांची स्पष्ट उत्तरं द्या
  • Strict mode, trap, locks आणि option parsing समजावा
  • Senior level वर safe, maintainable production scripts वर चर्चा करा
  • Whiteboard किंवा live shell वर 25 common coding exercises solve करा
  • दुसऱ्याची buggy script वाचा आणि fix करा
  • Bash कधी चुकीचा tool आहे ते ओळखा

1. रोजचं उदाहरण: recipe card

हे का लागतं?

पुण्याच्या स्वयंपाकघरातलं आजीचं पुरणपोळी recipe card ingredients, क्रमाने steps, काय तपासायचं (डाळ मऊ झाली का?), आणि काही चुकलं तर काय करायचं (जास्त चिकट, कणिक घाला) सांगतं. चांगली shell script म्हणजे computer साठी तसंच card. Interviewers बघतात की तुमचं card स्पष्ट, safe आहे आणि कुटुंबातल्या दुसऱ्या कोणी follow केलं तरी प्रत्येक वेळी चालतं.

हे काय आहे?

Ingredients = variables आणि arguments. Steps = क्रमाने commands. 'डाळ मऊ झाली का?' = if tests आणि exit codes. 'जास्त चिकट, कणिक घाला' = error handling आणि trap. कुटुंबातल्या दुसऱ्याने follow करणे = teammate ने तुमची script चालवणे.

कसं करायचं (step by step)

Live scripting exercise कसा solve करायचाTask परत सांगा आणि inputs बद्दल विचाराShebang आणि strict mode लिहाArguments validate कराMain logic साधेपणाने solve कराErrors आणि edge cases handle कराचालवा आणि output समजावा
या सहा steps बोलत करणे final script इतकंच महत्त्वाचं.

2. Scripting interviews खरंच काय तपासतात

हे का लागतं?

बऱ्याच candidates ना commands माहीत असतात पण त्यांच्या scripts spaces, रिकाम्या input किंवा errors वर तुटतात. Interviewers तीच कमतरता शोधतात.

हे काय आहे?

ते चार गोष्टी तपासतात: correctness (चालते का), safety (quotes, strict mode, धोकादायक deletes नाहीत), clarity (names, functions, usage) आणि judgement (awk कधी, Python वर कधी जायचं). छोटी बरोबर script लांब clever script पेक्षा चांगली.

AreaRed flagGreen flag
Quotingfor f in $(ls)for f in ./*; do "$f"
ErrorsNo exit codesset -euo pipefail and clear exit 1/2
CleanupTemp files left behindmktemp plus trap EXIT
Deletesrm -rf $DIR/rm -rf "${DIR:?}"/ after checks
Judgement300-line bash JSON parserjq, or Python for complex logic

कसं करायचं (step by step)

  1. Interviewers ना आवडणारा bug दाखवा: unquoted variables.
f='my report.txt'; touch "$f"; ls $f; ls "$f"

Output:

ls: cannot access 'my': No such file or directory
ls: cannot access 'report.txt': No such file or directory
my report.txt

याचा अर्थ: Unquoted असताना नाव दोन words मधे तुटलं. Quoted असताना चालतं.

  1. pipefail का महत्त्वाचा ते दाखवा.
false | true; echo "without: $?"; set -o pipefail; false | true; echo "with: $?"

Output:

without: 0
with: 1

याचा अर्थ: pipefail शिवाय fail झालेली पहिली command लपते.

  1. Reviewers करतात तशी script lint करा.
printf '#!/bin/bash\nfor f in $(ls *.log); do rm $f; done\n' > bad.sh; shellcheck bad.sh | grep -o 'SC[0-9]*' | sort -u

Output:

SC2045
SC2086

याचा अर्थ: SC2045: ls output वर iterate करणे. SC2086: unquoted variable. Interview मधे दोन्ही सांगा.

3. कोणत्याही interview मधे लिहायचा script template

हे का लागतं?

प्रत्येक उत्तर त्याच safe skeleton पासून सुरू केलं की वेळ वाचतो आणि चांगल्या सवयी लगेच दिसतात.

हे काय आहे?

Template मधे shebang, strict mode, usage function, argument checks, log helper, trap cleanup सह temp folder आणि main function असतं. तुम्ही ते सुमारे दोन minutes मधे आठवणीतून लिहू शकता, मग task भरा.

कसं करायचं (step by step)

  1. Template.
#!/usr/bin/env bash
set -euo pipefail
usage(){ echo "usage: ${0##*/} -f FILE [-n]" >&2; exit 2; }
log(){ printf '%s %s\n' "$(date '+%F %T')" "$*" >&2; }
file='' dry=0
while getopts 'f:nh' o; do case $o in f) file=$OPTARG;; n) dry=1;; *) usage;; esac; done
[[ -n $file && -r $file ]] || usage
tmp=$(mktemp -d); trap 'rm -rf "$tmp"' EXIT
main(){ log "processing $file dry=$dry"; wc -l < "$file"; }
main

याचा अर्थ: Strict mode, usage, getopts, validation, logging, cleanup आणि main. लिहिताना प्रत्येक भाग सांगा.

  1. चांगल्या आणि चुकीच्या input सह चालवा.
./tpl.sh -f /etc/hosts; ./tpl.sh -f /nope; echo "exit=$?"

Output:

2026-10-26 10:40:12 processing /etc/hosts dry=0
4
usage: tpl.sh -f FILE [-n]
exit=2

याचा अर्थ: चांगला input चालतो; चुकीचा input usage दाखवतो आणि exit 2.

  1. Flow समजावायला trace करा.
PS4='+ ${LINENO}: ' bash -x ./tpl.sh -f /etc/hosts 2>&1 | head -4

Output:

+ 3: file=
+ 3: dry=0
+ 4: getopts f:nh o
+ 4: case $o in

याचा अर्थ: Line numbers ने interviewer ला script मधून नेता येतं.

4. अनेक industries मधली खरी उदाहरणं

हे का लागतं?

तेच Linux skill प्रत्येक प्रकारच्या company मध्ये लागतं. वेगवेगळ्या ठिकाणी पाहिलं की लक्षात राहतं.

हे काय आहे?

प्रत्येक row म्हणजे एक काल्पनिक team. कोण हे वापरतं आणि कसं ते दाखवते.

कसं करायचं (step by step)

Team आणि शहरते कसं वापरतातCommand
Pooja, logistics, Chakan PuneFreshers ना even-odd आणि backup exercises विचारतेtar -czf backup.tgz dir
Arjun, fintech, GurugramStrict mode आणि rollback वर senior roundset -euo pipefail
Emma, cloud consultancy, Dublinawk सह log parsing वर live exerciseawk '{c[$9]++} END{for(s in c) print s,c[s]}'
Kenji, robotics, NagoyaShellCheck findings सह code review roundshellcheck deploy.sh
Fatima, hospital IT, Karachiflock आणि cron overlap बद्दल विचारतेflock -n /var/lock/job.lock job.sh
Sachin, dairy co-op, KolhapurCSV मधून user creation तपासतोuseradd -m -g staff ravi

5. नेहमीच्या errors आणि त्यांचे fixes

हे का लागतं?

हे errors सगळ्यांना येतात. कारण माहीत असलं की तास वाचतात.

हे काय आहे?

आधी नेमका message वाचा. मग खालच्या row शी जुळवा.

कसं करायचं (step by step)

दिसणारा errorका होतंFix कसा करायचा
line 3: [: too many arguments[ ] मधे spaces असलेला unquoted variableQuote करा किंवा [[ ]] वापरा.
[[ $name == "Asha Patil" ]]
unbound variableset -u आणि unset variableDefault द्या.
echo "${1:-}"
syntax error near unexpected token `fi'then किंवा semicolon नाहीif ...; then तपासा.
bash -n script.sh
bad interpreter: /bin/bash^MWindows line endingsUnix ला convert करा.
sed -i 's/\r$//' script.sh
command not found after cd in a scriptPATH किंवा typo, किंवा sh ने चालवलेली scriptFull paths आणि bash वापरा.
command -v jq
Variable empty after while loopPipe ने subshell बनवलाLoop input redirect करा.
while read -r l; do n=$((n+1)); done < file
arithmetic: value too great for baseLeading zero octal म्हणून वाचलाBase 10 force करा.
echo $(( 10#08 + 1 ))
Script runs twice from cron at onceLock नाहीflock ने wrap करा.
flock -n /var/lock/x.lock /opt/x.sh
Permission denied running ./script.shExecute bit नाही किंवा noexec mountchmod +x किंवा bash ने चालवा.
chmod +x script.sh

6. Troubleshooting step by step

हे का लागतं?

Live round मधे script fail झाली तर शांतपणे आणि मोठ्याने debug करा; debugging चं पण grading होतं.

हे काय आहे?

वरून खाली जा. ज्या step ला problem दिसतो तिथे थांबा.

कसं करायचं (step by step)

  1. न चालवता syntax तपासा.
bash -n script.sh
  1. Trace सह चालवा.
bash -x script.sh arg1
  1. Fail होणाऱ्या step चा exit code print करा.
cmd; echo "rc=$?"
  1. declare -p ने variables तपासा.
declare -p file dry
  1. Lint करा.
shellcheck script.sh
  1. सगळ्यात लहान failing भाग एकटा test करा.
echo '1,2,3' | awk -F, '{print $2}'

7. Lab 1: 30 minutes मधे पाच live coding exercises

हे का लागतं?

Timer लावून, template वापरून coding group मधले पाच exercises solve करा, आणि प्रत्येक चालवा.

हे काय आहे?

पूर्ण hands-on lab. प्रत्येक step test Linux machine वर करा (EC2 instance, VM किंवा WSL).

कसं करायचं (step by step)

  1. Exercise: even की odd.
bash evenodd.sh 7; bash evenodd.sh x; echo "rc=$?"

Output:

7 is odd
not a number
rc=2
  1. Exercise: sample log मधून top 5 IPs.
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -3

Output:

    912 49.36.12.8
    305 103.21.4.77
    120 10.0.0.5
  1. Exercise: शेवटचे 7 backups ठेवा.
ls -1t backups/backup-*.tgz | tail -n +8 | xargs -r rm -v | wc -l

Output:

3
  1. Exercise: URL साठी थांबा.
bash waiturl.sh http://localhost:8080/health

Output:

up
  1. Exercise: IP validate करा.
source ipcheck.sh; valid_ip 10.0.0.25 && echo ok; valid_ip 10.0.0.256 || echo bad

Output:

ok
bad

8. Lab 2: Buggy script review करून fix करा

हे का लागतं?

तुटलेली cleanup script घ्या, ShellCheck आणि tests ने प्रत्येक bug शोधा, आणि safely पुन्हा लिहा.

हे काय आहे?

पूर्ण hands-on lab. प्रत्येक step test Linux machine वर करा (EC2 instance, VM किंवा WSL).

कसं करायचं (step by step)

  1. Buggy script बनवा.
printf '#!/bin/bash\nDIR=$1\ncd $DIR\nfor f in $(ls *.tmp); do rm $f; done\necho done\n' > clean.sh; cat clean.sh

Output:

#!/bin/bash
DIR=$1
cd $DIR
for f in $(ls *.tmp); do rm $f; done
echo done
  1. Lint करा.
shellcheck clean.sh | grep -o 'SC[0-9]*' | sort | uniq -c

Output:

      1 SC2045
      3 SC2086
  1. धोका दाखवा: test folder मधे argument शिवाय चालवा.
mkdir -p /tmp/t && cd /tmp/t && bash ~/clean.sh; pwd

Output:

done
/tmp/t
  1. Safely पुन्हा लिहा.
cat > clean.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
dir=${1:?usage: clean.sh DIR}
cd -- "$dir"
shopt -s nullglob
for f in ./*.tmp; do rm -f -- "$f"; done
echo "cleaned $dir"
EOF
shellcheck clean.sh && echo lint-ok

Output:

lint-ok
  1. Safe version test करा.
bash clean.sh; echo "rc=$?"; touch /tmp/t/a.tmp '/tmp/t/b c.tmp'; bash clean.sh /tmp/t; ls /tmp/t | wc -l

Output:

clean.sh: line 3: 1: usage: clean.sh DIR
rc=1
cleaned /tmp/t
0

9. Beginner: shell scripting basics

हे का लागतं?

Interviewers हे पुन्हा पुन्हा विचारतात. प्रत्येकाचं स्पष्ट, छोटं उत्तर माहीत असलं की confidence येतो.

हे काय आहे?

प्रत्येक प्रश्न उघडला की पूर्ण उत्तर दिसतं. उत्तर वाचा, मग स्वतःच्या शब्दांत मोठ्याने सांगा.

कसं करायचं (step by step)

आधी न उघडता उत्तर द्यायचा प्रयत्न करा. मग उघडा, compare करा, आणि कोणतीही command test machine वर चालवा.

प्र. Shell script म्हणजे काय?

क्रमाने चालणाऱ्या shell commands असलेली text file. Backups, log cleanup, deployments आणि reports सारखी वारंवार होणारी कामं automate करते.

प्र. Shebang line म्हणजे काय?

#!/usr/bin/env bash सारखी पहिली line, script थेट execute केल्यावर कोणता interpreter वापरायचा ते system ला सांगते.

प्र. Script कशी चालवायची?

chmod +x script.sh मग ./script.sh, किंवा execute permission शिवाय bash script.sh. source script.sh current shell मधे चालवतो.

प्र. bash script.sh आणि source script.sh मधे फरक?

bash नवा child shell सुरू करतो, म्हणून variables आणि cd तुमच्या shell वर परिणाम करत नाहीत. source (किंवा .) current shell मधे चालतो, म्हणून बदल राहतात.

प्र. Variable कसा बनवायचा?

= च्या दोन्ही बाजूंना space न ठेवता name=value. $name किंवा "${name}" ने वाचा. Spaces असलेल्या values quote करा: city="New Delhi".

प्र. Variables quote का करायचे?

Quotes शिवाय shell values spaces वर तोडतो आणि globs expand करतो, म्हणून my file.txt नावाची file दोन words होते. "$var" ती एकच ठेवतो.

प्र. Single आणि double quotes मधे फरक?

Single quotes सगळं literal ठेवतात. Double quotes $var, $(cmd) आणि backslash escapes चालू देतात पण word splitting थांबवतात.

प्र. Command output variable मधे कसा ठेवायचा?

today=$(date +%F). जुना backtick form `date` चालतो पण nest करायला कठीण.

प्र. User input कसा वाचायचा?

read -rp 'Enter name: ' name. Passwords साठी input लपवायला -s आणि timeout साठी -t 10.

प्र. Positional parameters म्हणजे काय?

$1, $2 वगैरे arguments, $0 script name, $# count, "$@" सगळे वेगवेगळे आणि $* सगळे एक string म्हणून. shift त्यांना डावीकडे सरकवतो.

प्र. if statement कसं लिहायचं?

if [[ -f /etc/app.conf ]]; then echo found; else echo missing; fi. जास्त branches साठी elif.

प्र. Common file tests कोणते?

-f regular file, -d directory, -e exists, -r readable, -w writable, -x executable, -s रिकामी नाही, -L symlink.

प्र. Numbers आणि strings compare कसे करायचे?

Numbers: -eq, -ne, -lt, -le, -gt, -ge, किंवा (( a > b )). Strings: [[ ]] मधे == आणि !=, रिकाम्यासाठी -z आणि रिकामं नसलेल्यासाठी -n.

प्र. [ ] आणि [[ ]] मधे फरक?

[ ] POSIX test command आहे आणि काळजीपूर्वक quoting लागतं. [[ ]] bash keyword आहे जो रिकामे variables handle करतो, && आणि || support करतो, == ने pattern matching आणि =~ ने regex.

प्र. for loop कसा लिहायचा?

for f in *.log; do gzip "$f"; done. Numbers साठी: for i in {1..5} किंवा for ((i=1;i<=5;i++)).

प्र. while loop कसा लिहायचा?

while condition; do ...; done. उदा. while ! curl -sf localhost:8080; do sleep 2; done app up होईपर्यंत थांबतो. until condition false असेपर्यंत चालतो.

प्र. break आणि continue काय करतात?

break loop मधून बाहेर पडतो. continue पुढच्या iteration ला जातो. Nested loops साठी दोन्ही number घेतात, उदा. break 2.

प्र. case statement कसं लिहायचं?

case "$1" in start) start_app;; stop) stop_app;; *) echo "usage: $0 start|stop";; esac. अनेक elif branches पेक्षा स्वच्छ.

प्र. Function कसं define आणि call करायचं?

greet() { echo "Hi $1"; } मग greet Asha. आतल्या variables साठी local, आणि status साठी return N किंवा output साठी echo.

प्र. Exit code म्हणजे काय?

प्रत्येक command परत देणारा 0 ते 255 number. 0 म्हणजे success. $? शेवटचा ठेवतो आणि exit N script N सह संपवतो.

प्र. Commands मधे && आणि

काय करतात? || a && b फक्त a success झाल्यावर b चालवतो. a || b फक्त a fail झाल्यावर b चालवतो. mkdir -p dir && cd dir || exit 1 हा common pattern.

प्र. Bash मधे arithmetic कसं करायचं?

Integers साठी $(( a + b )), increment साठी (( count++ )), let आणि expr जुने forms. Decimals साठी bc किंवा awk, उदा. echo '3.5*2' | bc.

प्र. Comments कशा टाकायच्या?

# line च्या शेवटपर्यंत comment सुरू करतो. Block साठी बरेच जण अनेक # lines वापरतात; : ला here-doc पण चालतो पण कमी स्पष्ट.

प्र. Script debug कशी करायची?

bash -x script.sh किंवा आत set -x प्रत्येक command चालण्याआधी print करतो. bash -n न चालवता syntax तपासतो आणि shellcheck common bugs शोधतो.

प्र. Bash मधे array म्हणजे काय?

List variable: servers=(web1 web2 db1). ${servers[0]} पहिला, "${servers[@]}" सगळे items, ${#servers[@]} count. declare -A key-value maps बनवतो.

प्र. Here-doc म्हणजे काय?

Command ला अनेक lines द्यायचा मार्ग: cat <<EOF > file मग lines मग EOF. आत variable expansion थांबवायला 'EOF' quote करा.

प्र. Command exists आहे का कसं तपासायचं?

if command -v jq >/dev/null; then ... fi. Scripts मधे which टाळा कारण त्याचा output systems नुसार बदलतो.

प्र. /dev/null म्हणजे काय?

त्यात लिहिलेलं सगळं टाकून देणारी special file. cmd >/dev/null 2>&1 सगळा output शांत करतो.

प्र. Newline शिवाय किंवा formatting सह print कसं करायचं?

printf 'Name: %s Age: %d\n' Asha 30 exact formatting देतो. echo -n newline शिवाय print करतो पण echo shells नुसार बदलतो, म्हणून printf जास्त safe.

प्र. File name मधे current date कशी घ्यायची?

backup-$(date +%F).tgz ने backup-2026-10-26.tgz मिळतं. पूर्ण stamp साठी date +%Y%m%d-%H%M%S.

प्र. $* आणि $@ मधे फरक?

Unquoted दोन्ही सारखे. "$@" प्रत्येक argument वेगळा ठेवतो (पुढे पाठवायला बरोबर), तर "$*" सगळे IFS च्या पहिल्या character ने जोडून एक string करतो.

प्र. $$ आणि $! काय?

$$ current shell चा PID, बहुतेक temp file names साठी. $! शेवटच्या background job चा PID, wait किंवा kill सह वापरतात.

प्र. Alias म्हणजे काय?

Command साठी छोटं नाव, जसं alias ll='ls -lah'. Aliases interactive shells साठी; scripts मधे functions वापरा.

प्र. .bashrc आणि .bash_profile मधे फरक?

.bash_profile (किंवा .profile) SSH sessions सारख्या login shells साठी चालतो; .bashrc नव्या terminal tabs सारख्या interactive non-login shells साठी. बहुतेक setups .bash_profile मधून .bashrc source करतात.

प्र. Variable child processes ना कसा उपलब्ध करायचा?

export NAME=value. export शिवाय variable फक्त current shell मधे असतो. env NAME=value cmd एका command साठी set करतो.

प्र. test -z "$var" काय तपासतं?

String रिकामी असेल किंवा variable unset असेल तेव्हा true. -n उलटं.

प्र. Error message सह script लवकर exit कशी करायची?

echo 'config missing' >&2; exit 1. Errors stderr (>&2) वर लिहा म्हणजे normal output मधे मिसळत नाहीत.

प्र. stdin, stdout आणि stderr म्हणजे काय?

तीन standard streams: 0 input, 1 normal output, 2 errors. <, > किंवा 1>, आणि 2> ने redirect करा.

प्र. Command output च्या lines वर safely loop कसा करायचा?

while IFS= read -r line; do ...; done < <(cmd). यामुळे spaces राहतात आणि loop current shell मधे चालतो म्हणून variables टिकतात.

प्र. sh आणि bash मधे फरक?

sh हा POSIX shell (Ubuntu वर dash, RHEL वर sh mode मधला bash). bash arrays, [[ ]], brace expansion, process substitution आणि बरंच जोडतो. #!/bin/sh script ने bash-only features टाळायला हवेत.

प्र. Brace expansion म्हणजे काय?

{a,b,c} आणि {1..5} command चालण्याआधी lists बनवतात: mkdir -p app/{logs,conf,data} तीन folders बनवतो आणि cp file{,.bak} backup copy बनवतो.

प्र. Globbing म्हणजे काय?

Command चालण्याआधी shell *.log, file?.txt आणि [0-9]* सारखे patterns matching file names मधे expand करतो. काहीच match झालं नाही तर nullglob set नसेल तर pattern तसाच राहतो.

प्र. Missing argument साठी default value कशी घ्यायची?

env=${1:-dev} $1 रिकामा असेल तर dev वापरतो. ${VAR:?message} missing असेल तर error ने थांबतो.

प्र. String ची length कशी मिळवायची?

${#var}. उदा. name=Pune; echo ${#name} 4 दाखवतो.

प्र. Script ला usage message कसा print करायला लावायचा?

Syntax stderr वर print करून exit 1 करणारं usage function लिहा, आणि [[ $# -lt 1 ]] असेल किंवा -h वर ते call करा.

प्र. IFS variable चा उद्देश काय?

Internal Field Separator shell words कसे तोडतो आणि read fields कसे तोडतो ते ठरवतो. IFS=, read -r a b c <<< "$line" CSV line तोडतो.

प्र. Script मधे sleep कसं करायचं?

sleep 5 पाच seconds थांबतो; GNU sleep सह sleep 1m आणि sleep 0.5 पण चालतात.

प्र. Subshell म्हणजे काय?

( ), pipes किंवा $( ) ने बनलेली shell ची child copy. आतले बदल, जसे cd किंवा variables, parent वर परिणाम करत नाहीत.

प्र. कोणतीही command fail झाली तर script exit कशी करायची?

वर set -euo pipefail ठेवा, आणि अपेक्षित failures || true किंवा if blocks ने handle करा.

प्र. Script दर तासाला आपोआप कशी चालवायची?

0 * * * * /opt/scripts/report.sh >> /var/log/report.log 2>&1 सारखी cron line टाका, किंवा OnCalendar=hourly सह systemd timer बनवा.

10. Mid level: robust scripts, text processing आणि automation

हे का लागतं?

Interviewers हे पुन्हा पुन्हा विचारतात. प्रत्येकाचं स्पष्ट, छोटं उत्तर माहीत असलं की confidence येतो.

हे काय आहे?

प्रत्येक प्रश्न उघडला की पूर्ण उत्तर दिसतं. उत्तर वाचा, मग स्वतःच्या शब्दांत मोठ्याने सांगा.

कसं करायचं (step by step)

आधी न उघडता उत्तर द्यायचा प्रयत्न करा. मग उघडा, compare करा, आणि कोणतीही command test machine वर चालवा.

प्र. set -euo pipefail चा प्रत्येक भाग काय करतो आणि त्याचे traps कोणते?

-e errors वर exit करतो पण if conditions, && chains आणि conditions मधे call केलेल्या functions मधे ignore होतो. -u unset variables वर fail करतो, म्हणून optional साठी ${VAR:-} वापरा. pipefail pipeline मधला शेवटचा non-zero status परत देतो. Match न झालेला grep 1 परत देतो आणि script अनपेक्षितपणे थांबवू शकतो.

प्र. trap कशासाठी?

Signals किंवा exit वर code चालवतो: trap 'rm -f "$tmp"' EXIT temp files साफ करतो, trap 'echo failed at line $LINENO' ERR errors सांगतो, आणि trap '' INT Ctrl+C ignore करतो.

प्र. Temp files safely कशा बनवायच्या?

tmp=$(mktemp) किंवा dir=$(mktemp -d) unique, private path देतो. trap 'rm -rf "$dir"' EXIT सोबत वापरा. /tmp/out.txt सारखी fixed names कधीही वापरू नका.

प्र. Script च्या दोन copies एकाच वेळी चालू नयेत कसं करायचं?

flock वापरा: exec 9>/var/lock/backup.lock; flock -n 9 || { echo running; exit 1; }. किंवा cron line ला flock -n /var/lock/job.lock script.sh ने wrap करा.

प्र. Script मधे options parse कसे करायचे?

getopts short flags handle करतो: while getopts 'e:vh' o; do case $o in e) env=$OPTARG;; v) verbose=1;; h) usage;; esac; done; shift $((OPTIND-1)). Long options साठी $1 वर case आणि shift असलेला while loop.

प्र. Script मधून timestamps सह log कसा करायचा?

log(){ printf '%s %s\n' "$(date '+%F %T')" "$*" | tee -a "$LOG"; } मग log 'backup started'. logger -t backup 'started' syslog किंवा journal ला पाठवतो.

प्र. Script चा सगळा output log आणि screen दोन्हीकडे कसा पाठवायचा?

वर exec > >(tee -a "$LOG") 2>&1 त्यानंतरचं सगळं redirect करतो.

प्र. Process substitution म्हणजे काय?

<(cmd) command चा output file path म्हणून देतो. diff <(sort a) <(sort b) temp files शिवाय sorted files compare करतो. >(cmd) उलटं करतो.

प्र. Pipe loop मधे set केलेला variable का गायब होतो?

Pipeline चा प्रत्येक भाग subshell मधे चालतो, म्हणून cat f | while read l; do n=$((n+1)); done नंतर n बदलत नाही. done < f, done < <(cmd), किंवा shopt -s lastpipe वापरा.

प्र. Backoff सह command retry कशी करायची?

for i in 1 2 3 4 5; do cmd && break; sleep $((i*2)); done. Loop नंतर final status तपासा आणि कधीच success झालं नसेल तर exit करा.

प्र. Command ला timeout कसा लावायचा?

timeout 30 curl -s URL 30 seconds नंतर kill करतो आणि 124 परत देतो. timeout -k 5 30 cmd TERM नंतर 5 seconds ने KILL पाठवतो.

प्र. Tasks parallel मधे चालवून सगळ्यांची वाट कशी बघायची?

प्रत्येक & ने सुरू करा आणि wait call करा. प्रत्येक status wait $pid ने तपासायला PIDs save करा. xargs -P 4 किंवा GNU parallel एका वेळी किती चालतील ते limit करतात.

प्र. Spaces असलेल्या files वर safely loop कसा करायचा?

Quotes सह for f in ./*.csv; do ... "$f"; done चालतो. find results साठी find . -name '*.csv' -print0 | while IFS= read -r -d '' f; do ...; done. for f in $(ls) कधीही वापरू नका.

प्र. Associative arrays कसे वापरायचे?

declare -A port=([web]=80 [db]=5432); echo "${port[db]}"; for k in "${!port[@]}"; do echo "$k=${port[$k]}"; done. bash 4 लागतो.

प्र. File extension कसं काढायचं किंवा path मधून file name कसं घ्यायचं?

${f%.*} शेवटचं extension काढतो, ${f##*/} file name ठेवतो आणि ${f%/*} folder ठेवतो, सगळं external commands शिवाय.

प्र. Variable मधला text कसा replace करायचा?

${v/old/new} पहिला match आणि ${v//old/new} सगळे बदलतो. ${v^^} आणि ${v,,} case बदलतात.

प्र. Bash मधे string regex शी कशी तपासायची?

[[ $ip =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] && echo ok. Captured groups BASH_REMATCH मधे. Regex unquoted किंवा variable मधे ठेवा.

प्र. grep, sed आणि awk मधे फरक?

grep pattern शी जुळणाऱ्या lines शोधतो. sed streams edit करतो (substitute, delete, insert lines). awk columns आणि calculations साठी छोटी language, जसं field ची बेरीज किंवा grouping.

प्र. awk ने column ची बेरीज कशी करायची?

awk -F, '{s+=$3} END {print s}' sales.csv तिसऱ्या CSV column ची बेरीज करतो. Header skip करायला NR>1 जोडा.

प्र. sed ने दोन patterns मधल्या lines कशा print करायच्या?

sed -n '/START/,/END/p' file. sed -n '10,20p' file lines 10 ते 20 दाखवतो.

प्र. key=value pairs असलेली config file safely कशी वाचायची?

while IFS='=' read -r k v; do [[ $k =~ ^[A-Z_]+$ ]] && declare "$k=$v"; done < app.conf ने loop करा. Untrusted file source केली तर आतला कोणताही code चालतो, म्हणून ते टाळा.

प्र. Shell scripts मधे JSON सोबत कसं काम करायचं?

jq वापरा: jq -r '.items[].name' data.json, curl -s api | jq '.status', CSV साठी jq -r '.[] | [.id,.name] | @csv'. JSON grep किंवा sed ने parse करू नका.

प्र. Script मधे URL चा HTTP status कसा तपासायचा?

code=$(curl -s -o /dev/null -w '%{http_code}' "$url"); [[ $code == 200 ]] || alert. कधीही अडकू नये म्हणून --max-time 10 जोडा.

प्र. दोन files compare करून differences वर action कसं घ्यायचं?

if ! diff -q a b >/dev/null; then echo changed; fi, किंवा cmp -s a b ने compare करा. comm -13 <(sort a) <(sort b) फक्त b मधल्या lines दाखवतो.

प्र. Value परत देणारं function कसं लिहायचं?

Value print करून capture करा: get_ip(){ hostname -I | awk '{print $1}'; }; ip=$(get_ip). return फक्त 0 ते 255 status code देतो. nameref (declare -n) caller च्या variable मधे पण लिहू शकतो.

प्र. Functions मधे local का वापरायचं?

local शिवाय function मधले variables त्याच नावाचे globals overwrite करतात, आणि कठीण bugs येतात. local त्यांना function मधेच ठेवतो.

प्र. Library file ने scripts reusable कशा करायच्या?

Shared functions lib.sh मधे ठेवा आणि source "$(dirname "$0")/lib.sh" ने load करा. दोनदा load होण्यापासून guard करा आणि library मधे top-level actions ठेवू नका.

प्र. चालू script चा folder कसा शोधायचा?

dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd). दुसऱ्या folder मधून किंवा source मार्फत call केलं तरी चालतं.

प्र. Script root म्हणून चालते आहे हे validate कसं करायचं?

[[ $EUID -eq 0 ]] || { echo 'run as root' >&2; exit 1; }.

प्र. Dry-run mode कसा बनवायचा?

Actions wrap करा: run(){ if [[ $DRY == 1 ]]; then echo "+ $*"; else "$@"; fi; } मग run rm -f "$f". होण्याआधी काय होईल ते users बघू शकतात.

प्र. xargs safely कसा वापरायचा?

find . -name '*.tmp' -print0 | xargs -0 rm -f spaces handle करतो. -n 1 प्रत्येक command ला एक item देतो, -P 4 एका वेळी चार चालवतो आणि -I{} item हव्या त्या जागी ठेवतो.

प्र. exec cmd आणि cmd चालवण्यात फरक?

exec shell ला cmd ने बदलतो, म्हणून script तिथेच संपते आणि cmd ला तोच PID राहतो. Container entrypoints मधे common आहे म्हणजे signals app पर्यंत पोचतात. फक्त redirects सह exec script चे file descriptors बदलतो.

प्र. Disk usage तपासून limit पेक्षा जास्त असेल तर alert कसा द्यायचा?

use=$(df --output=pcent / | tail -1 | tr -dc 0-9); (( use > 85 )) && echo "disk ${use}%" | mail -s alert ops@example.com.

प्र. Quoted commas असलेला CSV कसा handle करायचा?

साधा awk -F, "Pune, MH" वर तुटतो. csvkit, mlr (Miller) किंवा Python चा csv module सारखा योग्य tool वापरा; किंवा GNU awk मधे FPAT='([^,]+)|("[^"]+")' सह awk.

प्र. ShellCheck म्हणजे काय आणि का वापरायचा?

Quoting bugs, न वापरलेले variables, चुकीचे tests आणि portability issues शोधणारा linter, प्रत्येकाला SC2086 सारखा code. Editor आणि CI मधे चालवा.

प्र. Line numbers सह trace कसा print करायचा?

export PS4='+ ${BASH_SOURCE}:${LINENO}: ' मग set -x. मग प्रत्येक traced line file आणि line दाखवते.

प्र. RHEL आणि Ubuntu दोन्हीवर चालणारी script कशी लिहायची?

. /etc/os-release आणि $ID ने detect करा, मग case statement मधे dnf किंवा apt, service names (httpd किंवा apache2) आणि paths निवडा. Tools तपासायला command -v वापरा.

प्र. लांब script cleanly थांबावी म्हणून signals कसे handle करायचे?

trap 'echo stopping; kill $(jobs -p) 2>/dev/null; exit 130' INT TERM. Handler मधे children आणि temp files साफ करा.

प्र. Script मधे menu कसा बनवायचा?

select opt in start stop status quit; do case $opt in quit) break;; *) systemctl "$opt" app;; esac; done. PS3 prompt set करतो.

प्र. Normal user script मधून root म्हणून file मधे कसं लिहायचं?

sudo echo x > /etc/file fail होतो कारण redirect तुम्ही म्हणून चालतो. echo x | sudo tee /etc/file >/dev/null, किंवा append साठी sudo tee -a वापरा.

प्र. Useless use of cat कसा टाळायचा?

cat file | grep pattern ऐवजी grep pattern file, आणि cat file | while read ऐवजी while read ... done < file वापरा. एक process वाचतो आणि variables टिकतात.

प्र. Random password किंवा string कशी बनवायची?

openssl rand -base64 18, किंवा tr -dc 'A-Za-z0-9' </dev/urandom | head -c 16. $RANDOM jitter साठी ठीक पण secrets साठी नाही.

प्र. nc शिवाय script मधून port open आहे का कसं तपासायचं?

timeout 3 bash -c "</dev/tcp/$host/$port" && echo open || echo closed. हे bash चं built-in /dev/tcp वापरतं.

प्र. Local variables सह remote servers वर script कशी चालवायची?

ssh host "bash -s" -- "$env" < deploy.sh local script आणि arguments पाठवतो. किंवा काळजीपूर्वक quoting सह ssh host "cd /app && ENV=$env ./run.sh".

प्र. Indentation सह here-doc कसा लिहायचा?

<<-EOF वापरा आणि lines tabs ने indent करा (spaces नाही); सुरुवातीचे tabs काढले जातात.

प्र. 7 दिवसांपेक्षा जुन्या files कशा शोधून delete करायच्या?

find /var/log/app -type f -name '*.log' -mtime +7 -print, list बरोबर दिसल्यावर तेच -delete सह.

प्र. Script idempotent कशी करायची?

Action आधी तपासा: mkdir -p, id user || useradd user, grep -q line file || echo line >> file, आणि enable आधी systemctl is-enabled. दोनदा चालवली तर दुसऱ्यांदा काहीच बदलू नये.

प्र. 126, 127 आणि 130 exit codes चा अर्थ?

126 सापडली पण executable नाही, 127 command not found, 130 Ctrl+C ने थांबली (128 अधिक signal 2). 137 म्हणजे signal 9 ने kill आणि 143 signal 15 ने.

प्र. Script किंवा step ला किती वेळ लागतो कसं measure करायचं?

पूर्ण run साठी time ./script.sh, किंवा आत start=$SECONDS; ...; echo "took $((SECONDS-start))s".

प्र. Shell scripts test कशा करायच्या?

Unit tests साठी bats-core, lint साठी shellcheck, syntax साठी bash -n, clean environments साठी container मधे चालवा, आणि CI job जोडा. Functions छोटी ठेवा म्हणजे test करायला सोपी.

11. Senior level: design, safety आणि production scripting

हे का लागतं?

Interviewers हे पुन्हा पुन्हा विचारतात. प्रत्येकाचं स्पष्ट, छोटं उत्तर माहीत असलं की confidence येतो.

हे काय आहे?

प्रत्येक प्रश्न उघडला की पूर्ण उत्तर दिसतं. उत्तर वाचा, मग स्वतःच्या शब्दांत मोठ्याने सांगा.

कसं करायचं (step by step)

आधी न उघडता उत्तर द्यायचा प्रयत्न करा. मग उघडा, compare करा, आणि कोणतीही command test machine वर चालवा.

प्र. Bash कधी सोडून Python किंवा Go वर जायचं?

Script ला complex data structures, काही jq calls पलीकडचं JSON किंवा API काम, जड error handling, unit tests, concurrency control लागतं किंवा ती काहीशे lines पलीकडे वाढते तेव्हा. Commands जोडणे, bootstrapping आणि साधं automation यासाठी bash सर्वोत्तम.

प्र. Production-grade deployment script कशी design करायची?

Strict mode, lock, validation सह स्पष्ट arguments, dry-run flag, timestamps सह logging, pre-checks (disk, health, versions), atomic switch (symlink swap किंवा नवा release folder), deploy नंतर health check, failure वर automatic rollback, idempotent steps आणि अर्थपूर्ण exit codes.

प्र. File update atomic कशी करायची?

त्याच filesystem वर temp file मधे लिहा, गरज असेल तर sync, मग mv tmp target. rename atomic आहे, म्हणून readers ना जुनी किंवा नवी file दिसते, कधीच अर्धी नाही.

प्र. Shell scripts मधले मुख्य security risks कोणते?

Unquoted variables (injection आणि globbing), user input वर eval, predictable temp files, ps मधे दिसणारे arguments मधले secrets, world-writable script paths, PATH वर विश्वास, आणि untrusted files source करणे. Quoting, mktemp, absolute paths, secrets files किंवा env मधून वाचणे, आणि कडक permissions ने fix करा.

प्र. Scripts ना secrets safely कसे द्यायचे?

Root-only file (chmod 600), systemd किंवा CI ने inject केलेला environment variable, किंवा aws secretsmanager किंवा vault सारखा secret manager CLI मधून वाचा. Command-line arguments टाळा आणि secret वापराभोवती set +x ठेवा म्हणजे traces मधे ते print होणार नाहीत.

प्र. eval धोकादायक का आणि पर्याय कोणते?

eval कोणताही text code म्हणून चालवतो, म्हणून ; rm -rf / सारखा user data command होतो. Commands बांधायला arrays (cmd=(rsync -a "$src" "$dst"); "${cmd[@]}"), dynamic variables साठी declare किंवा printf -v, आणि dispatch साठी case वापरा.

प्र. अनेक servers वर cron jobs मधे concurrency कशी handle करायची?

flock फक्त एका host वर चालतो. Hosts पलीकडे distributed lock (expiry सह DynamoDB किंवा Redis key, Consul किंवा etcd) वापरा, किंवा एका leader वर schedule करा, किंवा job idempotent करा म्हणजे duplicates निरुपद्रवी.

प्र. Production मधे bash scripts observable कशा करायच्या?

logger ने journal ला structured log lines (key=value किंवा JSON), अर्थपूर्ण exit codes, heartbeat किंवा push metric (Prometheus pushgateway किंवा CloudWatch put-metric-data), trap ERR मार्फत failure वर alerts, आणि status आणि history साठी systemd units म्हणून चालवा.

प्र. Cron की systemd timer: कोणता आणि का?

Timers journalctl मधे logs, dependency ordering, चुकलेले runs पकडायला Persistent=true, randomized delays, resource limits आणि सोपा status देतात. Cron सोपा आणि सगळीकडे आहे. Production services साठी timers सहसा चांगले.

प्र. Portable POSIX scripts कशा लिहायच्या?

#!/bin/sh, [[ ]] ऐवजी [ ], arrays नाहीत, $(...) ठीक, echo ऐवजी printf, strict POSIX मधे local नाही (dash support करतो तरी), brace expansion किंवा process substitution नाही, आणि dash आणि checkbashisms ने test करा.

प्र. Slow shell script fast कशी करायची?

मोठ्या loops मधे processes spawn करणे टाळा (parameter expansion, builtins आणि अनेक greps ऐवजी एक awk pass वापरा), xargs किंवा parallel ने batch करा, ControlMaster वापरून वारंवार ssh टाळा, आणि time आणि set -x timestamps ने measure करा.

प्र. Teammate ची shell script review कशी करायची?

Strict mode आणि quoting, input validation, error handling आणि cleanup, idempotency, hardcoded paths किंवा secrets, checks ने guarded destructive commands, shellcheck output, logging, आणि ते config management task असायला हवं का ते तपासा.

प्र. rm -rf "$DIR/" disasters कसे टाळायचे?

set -u आणि ${DIR:?} वापरा म्हणजे रिकामा variable script थांबवतो, path अपेक्षित root खाली आहे ते तपासा, गरज नसताना root म्हणून चालवू नका, आणि आधी trash folder मधे हलवणे prefer करा.

प्र. Shell scripts ऐवजी Ansible कधी वापराल?

अनेक servers ची state manage करताना: Ansible idempotent modules, inventory, templating, check mode, roles आणि reporting देतो. एका host वरच्या tasks किंवा Ansible च्या shell module मधल्या glue साठी shell ठीक.

प्र. Multi-server script मधे partial failures कसे handle करायचे?

प्रत्येक host चे results associative array मधे गोळा करा, failure वर पुढे चला, summary table print करा, आणि कोणताही host fail झाला तर non-zero exit करा. फक्त failed retry करायला --hosts flag जोडा.

प्र. Scripts तोडणारे common bash version differences कोणते?

macOS bash 3.2 देतो (associative arrays नाहीत, ${var^^} नाही, mapfile नाही). जुन्या RHEL वर bash 4.2. wait -n सारख्या features ला 4.3 आणि ${var@Q} ला 4.4 लागतो. गरज असेल तेव्हा BASH_VERSINFO तपासा.

प्र. System config files edit करणारी safe script कशी लिहायची?

Timestamp सह backup घ्या, validate करणाऱ्या tool ने edit करा (visudo -cf, nginx -t, sshd -t), atomically लिहा, log मधे diff ठेवा, आणि validation किंवा service restart fail झाला तर automatically roll back करा.

प्र. Team मधे scripts maintainable कशा ठेवायच्या?

Style guide (Google shell style), main function, छोटी नावाची functions, purpose आणि usage असलेला header, review सह version control, CI मधे shellcheck आणि bats, आणि examples सह README.

प्र. Foreground command ची वाट बघताना bash signals कसे handle करतो?

Foreground command संपल्यानंतरच traps चालतात. पटकन react करायला command background मधे चालवा आणि wait करा; trapped signal आला की wait लवकर परत येतो.

प्र. Container entrypoint script बरोबर कशी लिहायची?

set -e वापरा, env vars मधून config तयार करा, मग exec "$@" म्हणजे app PID 1 होतो आणि SIGTERM मिळतो. App child processes reap करत नसेल तर tini किंवा --init वापरा.

प्र. Server bootstrap (user-data) script मधे काय ठेवाल?

Strict mode आणि file ला logging, package updates, agents install (SSM, CloudWatch), users आणि SSH keys बनवणे, SSH harden करणे, UUID ने disks mount, S3 किंवा Parameter Store मधून config आणणे, services सुरू करणे, आणि orchestrator ला success किंवा failure कळवणे.

प्र. Shell मधे खूप मोठ्या log files efficiently कशा handle करायच्या?

Load न करता stream करा: fixed strings साठी grep -F, जलद matching साठी LC_ALL=C, compressed logs साठी zgrep किंवा zcat, awk single pass aggregates, memory साठी sort -S आणि --parallel, आणि आधी time window ने split करा.

प्र. इतर tools call करतात अशा scripts साठी exit codes कसे design करायचे?

0 success, 1 general error, 2 usage error, आणि 3 config missing किंवा 4 dependency down सारखे documented specific codes. ते stable ठेवा, कारण monitoring आणि CI त्यावर अवलंबून असतात.

प्र. खरा वेळ वाचवलेल्या तुम्ही लिहिलेल्या script बद्दल सांगा.

STAR वापरा: situation (उदा. दर महिन्याला 40 servers हाताने patch), task, काय बांधलं (health checks आणि rollback सह parallel, logged, idempotent patch script), आणि numbers मधे result (वाचलेले तास, कमी झालेल्या errors).

प्र. Scripts मधे time zones आणि dates कसे handle करायचे?

UTC मधे store आणि log करा (date -u), फक्त display साठी TZ=Asia/Kolkata date ने convert करा, ISO 8601 formats वापरा, आणि GNU date मधे date -d '7 days ago' +%F सारख्या arithmetic साठी date -d.

12. Coding exercises पूर्ण solutions सह

हे का लागतं?

बहुतेक scripting rounds मधे किमान एक live exercise असतो. पूर्ण solutions बघितले की interviewers शोधतात त्या सवयी शिकता येतात.

हे काय आहे?

प्रत्येक exercise उघडला की approach आणि copy करून चालवता येईल अशी पूर्ण script दिसते.

कसं करायचं (step by step)

आधी स्वतःचा version लिहायचा प्रयत्न करा, मग उघडून compare करा. दोन्ही test machine वर चालवा.

प्र. Argument म्हणून दिलेला number even आहे की odd हे print करणारी script लिहा.

Argument whole number आहे ते तपासा, मग remainder operator वापरा.

#!/usr/bin/env bash
set -euo pipefail
n=${1:?usage: $0 NUMBER}
[[ $n =~ ^-?[0-9]+$ ]] || { echo 'not a number' >&2; exit 2; }
if (( n % 2 == 0 )); then echo "$n is even"; else echo "$n is odd"; fi

प्र. rev न वापरता string उलटी करा.

Substring expansion वापरून शेवटच्या character पासून पहिल्यापर्यंत string वर फिरा.

#!/usr/bin/env bash
s=${1:?usage: $0 TEXT}
out=''
for (( i=${#s}-1; i>=0; i-- )); do out+=${s:i:1}; done
echo "$out"

प्र. Case ignore करून word palindrome आहे का तपासा.

Lower-case करा, उलटा करा, आणि compare करा.

#!/usr/bin/env bash
w=${1,,}
r=$(printf '%s' "$w" | rev)
[[ $w == "$r" ]] && echo palindrome || echo 'not palindrome'

प्र. पहिले N Fibonacci numbers print करा.

दोन variables ठेवा आणि प्रत्येक step ला त्यांना पुढे सरकवा.

#!/usr/bin/env bash
n=${1:-10}; a=0; b=1
for (( i=0; i<n; i++ )); do printf '%s ' "$a"; (( t=a+b, a=b, b=t )); done; echo

प्र. Number चा factorial शोधा.

Loop मधे गुणा करा; bash integers 64-bit आहेत, म्हणून 20! पर्यंत safe.

#!/usr/bin/env bash
n=${1:?}; f=1
for (( i=2; i<=n; i++ )); do (( f*=i )); done
echo "$n! = $f"

प्र. wc न वापरता file मधल्या lines, words आणि characters मोजा.

Line by line वाचा आणि बेरीज करा; यातून loops आणि expansion कसे चालतात ते दिसतं.

#!/usr/bin/env bash
l=0 w=0 c=0
while IFS= read -r line || [[ -n $line ]]; do
  (( l++ )); set -- $line; (( w+=$# )); (( c+=${#line}+1 ))
done < "${1:?file}"
echo "$l $w $c"

प्र. nginx access log मधून top 5 IP addresses print करा.

Client IP पहिला field आहे; sort आणि uniq ने मोजा.

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -5

प्र. Access log मधले HTTP status codes मोजा.

Combined log format मधे status field 9 आहे.

awk '{c[$9]++} END {for (s in c) print s, c[s]}' /var/log/nginx/access.log | sort

प्र. सगळ्या mounted filesystems साठी disk usage alert script लिहा.

Fixed columns सह df वापरा, tmpfs skip करा, आणि threshold पेक्षा जास्त असेल तर alert द्या.

#!/usr/bin/env bash
set -euo pipefail
limit=${1:-80}
df -P -x tmpfs -x devtmpfs | awk 'NR>1 {gsub("%","",$5); print $5, $6}' |
while read -r use mnt; do
  (( use >= limit )) && echo "ALERT $mnt at ${use}%"
done
exit 0

प्र. Dated archive सह folder backup करा आणि फक्त शेवटचे 7 ठेवा.

Archive बनवा, मग जुने वेळेनुसार list करा आणि 7 पलीकडचे delete करा.

#!/usr/bin/env bash
set -euo pipefail
src=${1:?src}; dst=${2:?dst}
mkdir -p "$dst"
tar -czf "$dst/backup-$(date +%F-%H%M).tgz" -C "$(dirname "$src")" "$(basename "$src")"
ls -1t "$dst"/backup-*.tgz | tail -n +8 | xargs -r rm -f

प्र. Services ची list चालू आहे का तपासा आणि down असलेली restart करा.

Names वर loop करा, systemctl is-active वापरा, आणि actions log करा.

#!/usr/bin/env bash
for s in nginx sshd crond; do
  if ! systemctl is-active --quiet "$s"; then
    echo "$(date '+%F %T') $s down, restarting"
    systemctl restart "$s" || echo "restart of $s failed" >&2
  fi
done

प्र. username,group असलेल्या CSV file मधून users बनवा.

प्रत्येक line वाचा, header skip करा, group आणि user missing असतील तरच बनवा.

#!/usr/bin/env bash
set -euo pipefail
while IFS=, read -r u g; do
  [[ $u == username ]] && continue
  getent group "$g" >/dev/null || groupadd "$g"
  id "$u" &>/dev/null || useradd -m -g "$g" "$u"
done < "${1:?csv}"

प्र. Folder खालच्या 10 सर्वात मोठ्या files शोधा.

Size output सह find आणि sort वापरा.

find "${1:-.}" -type f -printf '%s %p
' 2>/dev/null | sort -rn | head -10 | awk '{printf "%.1f MB %s
", $1/1048576, $2}'

प्र. Folder मधल्या सगळ्या .jpeg files .jpg ला rename करा.

Extension बदलायला parameter expansion आणि overwrite टाळायला mv -n वापरा.

for f in *.jpeg; do [[ -e $f ]] || continue; mv -n -- "$f" "${f%.jpeg}.jpg"; done

प्र. Web app 200 परत देईपर्यंत, 60 seconds पर्यंत थांबा.

curl सह loop आणि SECONDS वापरून deadline.

#!/usr/bin/env bash
url=${1:-http://localhost:8080/health}
end=$((SECONDS+60))
until [[ $(curl -s -o /dev/null -w '%{http_code}' --max-time 3 "$url") == 200 ]]; do
  (( SECONDS >= end )) && { echo 'timed out' >&2; exit 1; }
  sleep 2
done
echo up

प्र. File A मधे आहेत पण file B मधे नाहीत अशा lines print करा.

comm sorted input वर चालतो.

comm -23 <(sort -u a.txt) <(sort -u b.txt)

प्र. Folder मधे content नुसार duplicate files शोधा.

प्रत्येक file hash करा, मग एकापेक्षा जास्त वेळा दिसलेले hashes दाखवा.

find "${1:-.}" -type f -exec md5sum {} + | sort | awk '{h=$1; $1=""; if (h==p) {print pf; print $0} p=h; pf=$0}' | sort -u

प्र. Log file monitor करा आणि ERROR दिसल्यावर alert द्या.

tail -F rotation follow करतो; grep --line-buffered lines लगेच पुढे देतो.

tail -Fn0 /var/log/app/app.log | grep --line-buffered ERROR | while read -r line; do
  logger -t appwatch "ERROR seen: $line"
done

प्र. अनेक servers वर command parallel चालवा आणि failures report करा.

प्रत्येक ssh background मधे चालवा, PIDs array मधे ठेवा, आणि प्रत्येकाची wait करा.

#!/usr/bin/env bash
declare -A pid
for h in web1 web2 db1; do ssh -o ConnectTimeout=5 "$h" uptime > "/tmp/$h.out" 2>&1 & pid[$h]=$!; done
fail=0
for h in "${!pid[@]}"; do wait "${pid[$h]}" || { echo "FAIL $h"; fail=1; }; done
exit $fail

प्र. IPv4 address नीट validate करा.

Regex ने shape तपासा, मग प्रत्येक octet 0 ते 255.

valid_ip(){
  local ip=$1 o
  [[ $ip =~ ^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$ ]] || return 1
  for o in "${BASH_REMATCH[@]:1}"; do (( 10#$o <= 255 )) || return 1; done
}
valid_ip 10.0.0.256 && echo ok || echo bad

प्र. Text file मधले सर्वात जास्त वापरलेले words print करा.

Words मधे तोडा, lower-case करा, मोजा आणि sort करा.

tr -cs '[:alpha:]' '
' < book.txt | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -rn | head -10

प्र. CSV मधले दोन columns swap करा आणि बाकी तसेच ठेवा.

Comma separator सह awk fields swap करून line पुन्हा बांधतो.

awk -F, -v OFS=, '{t=$1; $1=$2; $2=t; print}' in.csv

प्र. 10 MB पेक्षा मोठा झाल्यावर स्वतःचा log rotate करणारी script लिहा.

stat ने size तपासा आणि लिहिण्याआधी timestamp सह बाजूला हलवा.

log=/var/log/myjob.log
if [[ -f $log ]] && (( $(stat -c %s "$log") > 10485760 )); then
  mv "$log" "$log.$(date +%F-%H%M%S)"; gzip "$log".*[0-9] 2>/dev/null || true
fi
echo "$(date '+%F %T') run" >> "$log"

प्र. एका program च्या सगळ्या processes ने वापरलेली memory (RSS) बेरीज करा.

ps RSS KB मधे दाखवतो; awk बेरीज करतो.

ps -C "${1:-nginx}" -o rss= | awk '{s+=$1} END {printf "%.1f MB
", s/1024}'

प्र. Symlink switch आणि automatic rollback सह deployment script लिहा.

नव्या release folder मधे unpack करा, current link बदला, health check करा, आणि failure वर परत बदला.

#!/usr/bin/env bash
set -euo pipefail
rel=/opt/app/releases/$(date +%Y%m%d%H%M%S)
prev=$(readlink -f /opt/app/current || true)
mkdir -p "$rel" && tar -xzf "${1:?artifact}" -C "$rel"
ln -sfn "$rel" /opt/app/current && systemctl restart app
if ! curl -sf --max-time 5 localhost:8080/health; then
  echo 'health failed, rolling back' >&2
  [[ -n $prev ]] && ln -sfn "$prev" /opt/app/current && systemctl restart app
  exit 1
fi
echo "deployed $rel"

Ravindra Bagale's Tip

In a live scripting round, write the safe template first even if the task is tiny. Then talk through each line. Interviewers often stop you halfway because they have already seen quoting, strict mode and cleanup, which is what they wanted to know.

13. नेहमी विचारले जाणारे प्रश्न

प्र. Interviewers man pages किंवा Google allow करतात का?

काही live rounds मधे man pages allow करतात; बरेच Google allow करत नाहीत. सुरुवातीला विचारा.

प्र. POSIX sh लिहू की bash?

त्यांनी POSIX सांगितलं नसेल तर bash. कोणता निवडला आणि का ते सांगा.

प्र. awk पुरेसा की Python लागेल?

awk columns आणि sums चांगले handle करतो; JSON, APIs किंवा complex logic साठी Python वापराल असं सांगा.

प्र. Coding exercises चा practice कसा करायचा?

इथलं प्रत्येक solution हाताने type करा, चालवा, बिघडवा आणि fix करा. मग आठवणीतून परत लिहा.

प्र. sed आणि awk खोलात विचारतात का?

सहसा common one-liners: substitution, ranges, column sums आणि grouping.

प्र. set -e नेहमी चांगलं का?

मदत करतं पण traps आहेत. pipefail सोबत वापरता आणि अपेक्षित failures explicitly handle करता असं सांगा.

प्र. Scripts मधली सर्वात common चूक कोणती?

Unquoted variables, खूप जास्त.

प्र. हे प्रश्न company specific आहेत का?

नाही, ते अनेक companies मधे typical आणि नेहमी विचारले जातात असं सांगितलं जाणारे आहेत.

14. मुलाखत प्रश्न आणि उत्तरं

Beginner level

प्र. $? मधे काय असतं?

शेवटच्या command चा exit status.

प्र. Script executable कशी करायची?

chmod +x script.sh.

प्र. 1 ते 10 loop कसा?

for i in {1..10}; do echo $i; done.

प्र. File line by line कशी वाचायची?

while IFS= read -r line; do ...; done < file.

Mid level level

प्र. Ctrl+C वर cleanup कसं ensure करायचं?

trap 'cleanup' EXIT INT TERM.

प्र. -v आणि -f FILE कसे parse करायचे?

getopts 'vf:'.

प्र. Parallel cron runs कसे टाळायचे?

Lock file वर flock -n.

प्र. Script चा स्वतःचा folder कसा मिळवायचा?

cd "$(dirname "${BASH_SOURCE[0]}")" && pwd.

Senior level

प्र. Deploy script पुन्हा चालवायला safe कशी करायची?

Idempotent steps, release folders, symlink switch, health check आणि automatic rollback.

प्र. Secrets traces आणि ps पासून कसे दूर ठेवायचे?

Files किंवा env मधून वाचा, त्याभोवती set +x, arguments म्हणून कधीही पाठवू नका.

प्र. Bash कधी चुकीचा पर्याय?

Complex data, JSON APIs, जड logic, long-lived services किंवा tests आणि types महत्त्वाचे असतील तेव्हा.

प्र. CI मधे scripts test कशा करता?

shellcheck, bash -n, bats-core tests आणि clean container मधे चालवणे.

घरी करून बघा

  1. या आठवड्यात template आठवणीतून तीनदा लिहा, दोन minutes पेक्षा कमी वेळ लागेपर्यंत.
  2. न बघता सगळे 25 coding exercises solve करा, मग इथल्या solutions शी compare करा.
  3. तुमच्याकडच्या प्रत्येक जुन्या script वर ShellCheck चालवा आणि warnings fix करा.

सराव Tasks

या scenario बद्दल

Vidarbha Cotton Mills हा नागपूर मधला वस्त्रोद्योग व्यवसाय आहे. Ganesh Wankhede त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे INR मध्ये मोजले जातात आणि AWS resources ap-south-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.

0 / 21

सोपं Strict mode

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: Strict mode चालू करा आणि ERR traps functions ना inherit होतील असं करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Exit status

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: शेवटच्या command चा exit status print करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Syntax check

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: deploy.sh न चालवता syntax errors तपासा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Trace

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: प्रत्येक command चा trace घेऊन deploy.sh चालवा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Lint

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: फक्त warnings आणि वरचे दाखवत deploy.sh lint करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Lines मोजा

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: access.log मधल्या फक्त lines ची संख्या print करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Grep count

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: app.log मधे ERROR असलेल्या lines मोजा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

सोपं Crontab edit

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: स्वतःचा crontab editing साठी उघडा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम Default arg

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: env variable ला पहिला argument किंवा नसेल तर prod set करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम Required arg

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: dir ला पहिला argument set करा, नसेल तर need dir message सह fail करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम Temp folder

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: Private temporary folder बनवा आणि त्याचा path variable work मधे ठेवा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम Cleanup trap

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: Script exit झाल्यावर किंवा INT किंवा TERM मिळाल्यावर work मधला folder काढा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम Lines वाचा

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: users.txt line by line safely variable u मधे वाचा आणि प्रत्येक echo करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम Column sum

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: awk ने sales.csv च्या 3ऱ्या comma-separated column ची बेरीज करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम File मधे replace

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: .bak backup ठेवून config.ini मधे प्रत्येक foo च्या जागी bar in place करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम जुन्या files

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: /var/log/app खालच्या 7 दिवसांपेक्षा जुन्या .log files delete करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

मध्यम Root म्हणून लिहा

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: Normal shell मधून root म्हणून /proc/sys/net/ipv4/ip_forward मधे 1 text लिहा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

अवघड Single instance

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: Lock /var/lock/job.lock free असेल तरच /opt/job.sh चालवा, नाहीतर लगेच exit करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

अवघड Top IPs

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: access.log मधले top 5 client IPs (field 1) counts सह, सर्वात जास्त आधी, print करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

अवघड Leading zero

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: Base 10 force करून 08 plus 1 decimal arithmetic म्हणून print करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

अवघड Options loop

का: BIZ live rounds मधे scripting skill तपासतो.

काय करायचं: v आणि value घेणारा f या options साठी variable o मधे getopts loop सुरू करा.

कसं करायचं:
  1. हे काम करणारा Linux command शोधा.
  2. Task ला लागणारे options (उदा. -r, -h) जोडा.
  3. File नावं, folders किंवा users योग्य क्रमाने लिहा.
  4. System files/users बदलत असाल तर sudo वापरा. Check answer दाबा.

थोडक्यात सांगायचं तर

  1. 150 प्रश्न: 50 beginner, 50 mid, 25 senior, 25 coding.
  2. प्रत्येक variable quote करा.
  3. Safe template पासून सुरू करा.
  4. set -euo pipefail काळजीने वापरा.
  5. Cleanup साठी trap, locks साठी flock.
  6. Python वर कधी जायचं ते जाणा.

उजळणी, तुलना आणि मुलाखत cards

हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.

Safe script template. Strict mode. Usage आणि exit 2. Temp आणि cleanup. प्रत्येक var quote.
उजळणी card: Safe script template · PNG download करा · Card page उघडा
Interview one-liners. Top IPs. Column sum. File मधे replace. जुन्या files.
उजळणी card: Interview one-liners · PNG download करा · Card page उघडा
set -e vs trap ERR. Failure वर थांबा. / Failure वर code चालवा.
तुलना: set -e vs trap ERR · PNG download करा · Card page उघडा
awk vs sed. Columns आणि maths. / Lines edit.
तुलना: awk vs sed · PNG download करा · Card page उघडा
Variables quote का?. Word splitting थांबवतो. Glob expansion थांबवतो. नेहमी.
मुलाखत card: Variables quote का? · PNG download करा · Card page उघडा
Pipe loop नंतर var रिकामा?. Pipe = subshell. Input redirect. किंवा process substitution.
मुलाखत card: Pipe loop नंतर var रिकामा? · PNG download करा · Card page उघडा
दोनदा cron runs थांबवा?. Lock file वापरा. Locked असेल तर exit. Kernel मोकळं करतो.
मुलाखत card: दोनदा cron runs थांबवा? · PNG download करा · Card page उघडा
Bash की Python?. Bash: commands जोडणे. Python: data, APIs. ~150 lines पुढे, पुन्हा विचार.
मुलाखत card: Bash की Python? · PNG download करा · Card page उघडा

अजून cards: Ravi Sir's Cards.