/ / em quais casos precisamos limpar o array no script bash - arrays, linux, bash

em quais casos precisamos limpar o array no bash script - arrays, linux, bash

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 № 1

Como 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 )