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
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"
  1. batch ← logs

    3batch="logs"4case "$batch" in
    values this steplogsbatch
  2. case "$batch" in

    3batch="logs"4case "$batch" in5    logs) files=("app.log" "db.log") ;;
    values this steplogsbatch
  3. files ← 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.logfiles
  4. count ← 2

    7esac8count=${#files[@]}9echo "$batch:$count"
    values this step2countapp.log db.logfiles
  5. echo "$batch:$count"

    8count=${#files[@]}9echo "$batch:$count"
    outputlogs:2
    values this steplogsbatch2count
  1. batch ← reports

    3batch="reports"4case "$batch" in
    values this stepreportsbatch
  2. case "$batch" in

    3batch="reports"4case "$batch" in5    logs) files=("app.log" "db.log") ;;
    values this stepreportsbatch
  3. files ← sales.csv audit.csv

    5    logs) files=("app.log" "db.log") ;;6    reports) files=("sales.csv" "audit.csv") ;;7esac
    values this stepsales.csv audit.csvfiles
  4. count ← 2

    7esac8count=${#files[@]}9echo "$batch:$count"
    values this step2countsales.csv audit.csvfiles
  5. echo "$batch:$count"

    8count=${#files[@]}9echo "$batch:$count"
    outputreports:2
    values 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.