Linux dividindo array em variáveis separadas

4
Eu tenho programado no MVS há anos e recentemente tenho usado o Linux, então minhas habilidades em Linux ainda não são ótimas, mas eu entendo bem os conceitos de desenvolvimento.

O que estou tentando fazer é ler um diretório de arquivos e pegar o nome de todos os arquivos com uma extensão .trg. Então, eu preciso pegar esses nomes e armazená-los em variáveis separadas para que eu possa usá-los mais tarde no meu script para se referir a componentes e usá-los para a nomeação de arquivos. Eu obtive os nomes dos arquivos usando o comando find:

param='find *${file_name}*.trg

Isso produziu a variável $ param carregada com os valores (ABC1099R ABC1099C), pois são dois arquivos no diretório chamado ABC1099R.trg e ABC1099C.trg Agora preciso atribuir esses valores a variáveis individuais para que eu possa usá-los mais tarde meu roteiro. Eu pesquisei alto e baixo na web, mas cada exemplo que eu encontro está usando echo para apenas exibi-los ou eles estão usando um loop while e usando os valores individuais dentro do loop. Eu preciso tê-los atribuídos às suas próprias variáveis para que eles estejam disponíveis para mim mais tarde no script.

Inicialmente eu tentei um loop for like assim:

for trigger_files in $param; do
    app1=(basename "{trigger_files}" .trg).dat
done

Mas isso só dá a primeira ocorrência app1 = ABC1099R

Preciso ter todas as ocorrências salvas em sua própria variável individual. Poderia haver potencialmente 20 nomes de arquivos, mas achei que precisava apenas trabalhar com dois, portanto, seria capaz de lidar com muitos.

    
por user50228 30.10.2013 / 00:27

2 respostas

9

Se você estiver usando , considere fazer o evento maneira.

Sua matriz seria assim obtida (nenhum comando find externo):

params=( *${file_name}*.trg )

e, em seguida, você percorre o array da seguinte forma:

for file in "${params[@]}"; do
    echo "I'm happily reading the beautiful file $file"
done

Se você deseja remover a extensão .trg e substituí-la por .banana :

for file in "${params[@]}"; do
    echo "My gorilla loves the file ${file%.trg}.banana"
done

Esse método, com as devidas cotações, será 100% seguro em relação ao arquivo com símbolos engraçados em seus nomes.

Observação. Use sempre globbings com shopt -s nullglob ou shopt -s failglob .

    
por 30.10.2013 / 01:19
2

Você pode declarar param como uma matriz em vez de uma string:

declare -a param=('find *${file_name}*.trg')

Agora você pode acessar os valores individuais usando um índice como se fossem variáveis individuais. Por exemplo:

echo ${param[1]}

imprime ABC1099C.trg (o segundo elemento da matriz. O índice começa com 0).

Se você quiser se livrar da extensão do arquivo, tente ${param[1]%.*}

Para saber mais sobre arrays, dê uma olhada aqui:

por 30.10.2013 / 01:05

Tags