Tanto quanto eu posso ver, você não tem nenhum array no seu código. A variável msgNumbers é uma string que contém a saída do seu comando cut .
Para iterar a saída de cut , use
#!/bin/bash
mailx -H | grep '^ [UN]' | cut -c 4-5 |
while read msg; do
print 'msg = %s\s' "$msg"
done
Isso envia a saída de cut para o loop while imediatamente a seguir, através do pipe ( | ). O loop while irá iterar com msg definido para cada linha individual de saída de cut .
O cut obtém seus dados diretamente do comando grep , o que elimina a necessidade de armazenar os dados em um arquivo intermediário.
Eu removi o comando echo $msg|mailx; porque não fazia muito sentido para mim (o utilitário mailx precisa de um endereço para enviar os dados).
O grep + cut também pode ser substituído por uma única chamada para awk , onde permitimos que awk faça o trabalho de ambas as ferramentas e imprima a segunda coluna delimitada por espaços em branco quando a expressão regular corresponder a:
#!/bin/bash
mailx -H | awk '/^ [UN]/ { print $2 }' |
while read msg; do
print 'msg = %s\s' "$msg"
done
Não estou comentando mais sobre o uso de mailx , pois é um utilitário não padrão que é implementado de forma ligeiramente diferente nos sistemas Unix (por exemplo, minha versão não possui a opção -H ).
A linha #! parece ok para mim, se você quiser que o script seja executado por bash e se o executável bash estiver localizado nesse caminho (que normalmente está nos sistemas Linux, por exemplo, mas verifique com command -v bash em seu sistema para ter certeza). O código que eu postei acima é compatível com /bin/sh , então bash não é realmente necessário para executá-lo (seria executado em qualquer shell sh -like).
Apenas certifique-se de que o script seja executável e que você o execute sem especificar um intérprete explícito.