Uma maneira "melhor", que é "melhor" na medida em que executa rm menos frequentemente, seria usar xargs :
{
for pm in "${pri[@]}"; do
printf '/primary/abc_monthly_%s_log.data\n' "$pm"
done
for sm in "${snd[@]}"; do
printf '/secondary/abc_monthly_%s_log.data\n' "$sm"
done
} | xargs rm
Isso usaria os loops apenas como um meio para gerar nomes de caminho. Esses nomes de caminho são então passados para xargs rm , o que executaria rm no maior número possível de uma só vez. Com os arrays de exemplo que você forneceu, provavelmente executaria apenas rm uma vez .
A maneira como escrevi acima supõe que nenhum dos componentes do caminho contém novas linhas literais ou espaços em branco (o que eles não fazem neste exemplo).