Shell Script: vetores

Um array mantêm uma série de elementos de dados, geralmente do mesmo tamanho e tipo de dados. Elementos individuais são acessados por sua posição no array, cuja posição é dada por um índice (geralmente, dentro de uma sequência de números inteiros). É conhecido como vetor, caso seja uni-dimensional, ou matriz, para um array bi-dimensional. Vejamos alguns pontos importantes e exemplos de uso de vetores em shell script (utilizado interpretador de comandos compatível com o sh, que é o bash).

Em um vetor, os elementos são separados por um espaço. Neste caso, o espaço não é um caractere (‘ ‘), e sim um separador dos elementos. Vejamos esse exemplo de vetor e o acesso às diferentes posições e elementos do vetor:

Nesse caso, aeroportos[0] é “cgh”, aeroportos[1] é “gru” e assim por diante. Para imprimir na tela o conteúdo de uma posição do vetor, temos:

Para exibir todos os elementos de um vetor, devemos usar a mesma estrutura, mas no lugar do índice, utilizar arroba [@] ou asterisco [*]. Veja o exemplo a seguir de uma rotina para copiar os dados de computadores em diferentes aeroportos para um computador de backup, onde cada diretório possui como nome a data do dia na forma ANO-MES-DIA:

Para exibir o intervalo fechado de i até i+k, use:

Outro exemplo, que conta o número de arquivos de diretórios (listados em cada linha do arquivo lista_dias.txt) e imprime o total em linhas do arquivo controle_aeroporto.txt

Para copiar o vetor original para uma nova variável, não basta fazer da mesma forma que é feito com uma variável. Além de indicar que deseja copiar todos os seus elementos, deve colocar novamente parênteses para transformar o conteúdo em elementos de um novo vetor:

Se não fizer isso, todos os elementos do vetor original viram uma única posição em uma variável. Uma discussão com exemplos é realizada no blog do Ahmed Amayem.

Para um script receber um vetor como argumento, ele deve ser inserido na chamada dessa rotina da seguinte forma:

Note que foram passados quatro variáveis e dois vetores. Para o shell script receber esses valores, não será possível receber um vetor como uma variável só. Assim, a ideia é tratar TODOS os elementos (incluindo os elementos dos vetores) como sendo um único array e depois separar as variáveis fora dos vetores. Veja o exemplo:

Por último, um exemplo com uns vetores enormes de mês, dia e hora (a cada 15 minutos). Seu objetivo é descompactar arquivos “.tar.gz” (ou “.tar.bz2”) e unir os conteúdos em outro arquivo final (também apaga diretório que não será mais usado e compacta arquivo):

Fontes: Viva o Linux – Brincando com vetores e Stack Overflow.