No exemplo a seguir, definimos a variável array - files_in_array , com todos os arquivos xml que localizam o comando capturado em / tmp
note - usamos o segundo "(" ")" para criar um array
files_in_array=( $( find /tmp -type f -name "*.xml" ) )
então agora podemos capturar o primeiro / segundo valor ... etc, como segue:
echo ${files_in_array[0]}
/tmp/demo_values.xml
echo ${files_in_array[1]}
/tmp/prod_values.xml
até agora tudo está perfeito
mas não tenho certeza se precisamos limpar a matriz como
files_in_array=()
Então, precisamos limpar o array antes de usar o array no script bash?
Respostas:
1 para resposta № 1Como as matrizes de variáveis são definidas no ambiente de processo do shell, diferentemente das variáveis, elas "não podem ser exportadas para serem acessadas em processos filhos.
O primeiro comando que você dá
files_in_array=( $( find /tmp -type f -name "*.xml" ) )
inicializa o array se files_in_array contiver dados, ele será limpo.
Como dito nos comentários, esta não é uma maneira segura de inicializar o array da maneira que você fez, porque após a expansão do processo $(..)
O resultado é dividido em abas espaços e novas linhas e um nome de arquivo pode ser dividido em elemnts, uma maneira segura é usar a expansão de arquivo glob porque ocorre depois e não é dividida. Então apenas
files_in_array=( /tmp/*.xml )
para obter todos os subcaminhos
shopt -s globstar
shopt -s nullglob
files_in_array=( /tmp/**/*.xml )
como dito nos comentários globstar foi introduzido no bash 4.0, antes desta outra maneira de fazê-lo com find -print0
files_in_array=( )
while IFS= read -d "" -r file; do
files_in_array+=( "$file" )
done < <( find /tmp -type f -name "*.xml" -print0 )