A maneira padrão de fazer aritmética no shell é $((..)) . O padrão test / [ suporta apenas comparações e outros testes. Então, a versão em conformidade com o padrão seria:
if [ "$(( p % 2 ))" -ne 0 ]; then...
(Isso só precisa das aspas se o seu IFS contiver dígitos, então normalmente eles não são necessários.)
No Bash / ksh / zsh, você pode usar a construção (( .. )) , que funciona como um comando e permite o teste também:
if (( p % 2 != 0 )); then ...
O teste [[ parece permitir alguma aritmética, mas é um pouco exigente quanto à sintaxe / espaço em branco, então você provavelmente não deveria fazer isso.
Quanto à razão pela qual a atribuição a p não persiste fora do loop, consulte