for f in ./*
do case ${f#??} in
(*.*.*|*[!-_.[:alnum:]]*) ;;
(NA*.txt)
: do something w/ "$f"
esac
done
A instrução case
permite ramificar blocos de código para várias possibilidades. Embora eu faça a correspondência acima para 2 ou mais pontos ou um caractere não-traço-sublinhado-ponto-alfanumérico, não funciona, você é tão livre para colocar um bloco de código quanto qualquer outro lugar. case
corresponde tanto quanto e assim que possível e, portanto, se você chegar à correspondência NA*.txt
, será apenas porque o nome do arquivo que corresponde a esse padrão também não / em> corresponde ao padrão que veio antes.
E como eu disse, esta é uma declaração de ramificação, e então ...
for f in ./*
do case ${f#??} in
(*.*.*|*[!-_.[:alnum:]]*) ;;
(NA*.txt)
: do something w/ "$f.txt";;
(NA*.pdf)
: do something w/ "$f.pdf";;
(FA*.txt)
: do something w/ "$f";;
(*)
: do something w/ everything else
esac
done
... é perfeitamente válido. Cada bloqueio condicional pode ser o tempo que você desejar - e as linhas novas e o restante são válidas dentro delas. Cada bloco condicional, mas o último deve ser delimitado com dois pontos e vírgulas, mas estes são opcionais para o último bloco condicional.
Quando o case
é avaliado, cada padrão é avaliado por sua vez. Se uma correspondência for encontrada, nenhum dos seguintes padrões será avaliado - eles estão efetivamente em curto-circuito nesse caso.