Practical Automation Patterns
Batch Select
Choose a Work Set
Automation often runs the same operation over a named batch of files. A case statement can map the batch name to a stable work set.
Program
Play the script to choose a batch and see how many files it selects.
batch_select.sh
Replay: real traced execution (multi-file project)
#!/usr/bin/env bash
batch="logs"
case "$batch" in
logs) files=("app.log" "db.log") ;;
reports) files=("sales.csv" "audit.csv") ;;
esac
count=${#files[@]}
echo "$batch:$count"
#!/usr/bin/env bash
batch="reports"
case "$batch" in
logs) files=("app.log" "db.log") ;;
reports) files=("sales.csv" "audit.csv") ;;
esac
count=${#files[@]}
echo "$batch:$count"
batch ← logs
3batch="logs"4case "$batch" invalues this steplogsbatchcase "$batch" in
3batch="logs"4case "$batch" in5 logs) files=("app.log" "db.log") ;;values this steplogsbatchfiles ← app.log db.log
4case "$batch" in5 logs) files=("app.log" "db.log") ;;6 reports) files=("sales.csv" "audit.csv") ;;values this stepapp.log db.logfilescount ← 2
7esac8count=${#files[@]}9echo "$batch:$count"values this step2countapp.log db.logfilesecho "$batch:$count"
8count=${#files[@]}9echo "$batch:$count"outputlogs:2values this steplogsbatch2count
batch ← reports
3batch="reports"4case "$batch" invalues this stepreportsbatchcase "$batch" in
3batch="reports"4case "$batch" in5 logs) files=("app.log" "db.log") ;;values this stepreportsbatchfiles ← sales.csv audit.csv
5 logs) files=("app.log" "db.log") ;;6 reports) files=("sales.csv" "audit.csv") ;;7esacvalues this stepsales.csv audit.csvfilescount ← 2
7esac8count=${#files[@]}9echo "$batch:$count"values this step2countsales.csv audit.csvfilesecho "$batch:$count"
8count=${#files[@]}9echo "$batch:$count"outputreports:2values this stepreportsbatch2count
batch
A batch name is a compact handle for a repeatable set of work.
case map
`case` keeps the mapping from names to work sets explicit.
array count
`${#files[@]}` counts selected array elements.