for fn in *
do case $fn in
(program*[1-8].c)
: do something;;
(other*program*[09].ext)
: do something with this match;;
(this*match|*or*|*any*"$of"*these*matches)
: do something with these matches
: do as many lines as you want;;
(*) : catch all last default match
esac
done
Uma técnica comumente usada em case
instruções é remover correspondências indesejadas com padrões mais específicos do que o padrão geralmente desejado. Por exemplo:
for fn in *
do case $fn in
(*[0-9][0-9].c) ;;
(program*[1-8].c)
echo mv "$fn" "${fn%???}0${fn#"${fn%???}"}"
esac
done
No exemplo acima, o primeiro padrão *[0-9][0-9].c
corresponde a todos os valores $fn
, em que dois ou mais dígitos podem ocorrer à esquerda da extensão. O bloco de execução para essas correspondências está vazio - null - nada acontece quando uma correspondência é encontrada. O mais importante, no entanto, porque as instruções case
funcionam de cima para baixo, o que isso significa é que os únicos resultados já correspondidos para o bloco de ação conterão apenas um dígito à esquerda da extensão e o comando echo
do exemplo um 0
antes de todos e cada um daqueles que ocorrem entre 1 e 8.