/ / w których przypadkach musimy wyczyścić tablicę w skrypcie bash - tablice, linux, bash

w takich przypadkach musimy wyczyścić tablicę w skrypcie bash - tablice, linux, bash

W poniższym przykładzie ustawiamy zmienną tablicową - files_in_array , ze wszystkimi plikami xml, które znajdują polecenia przechwycone w / tmp

uwaga - używamy drugiego „(„ ”)” do utworzenia tablicy

files_in_array=( $( find /tmp -type f -name "*.xml" ) )

więc teraz możemy przechwycić pierwszą / drugą wartość .. itd., jak poniżej

echo ${files_in_array[0]}

/tmp/demo_values.xml


echo ${files_in_array[1]}

/tmp/prod_values.xml

do tej pory wszystko jest idealne

ale nie jestem pewien, czy musimy wyczyścić tablicę jako

 files_in_array=()

więc czy musimy wyczyścić tablicę przed użyciem tablicy w skrypcie bash?

Odpowiedzi:

1 dla odpowiedzi № 1

Podobnie jak tablice zmiennych są zdefiniowane w środowisku procesu powłoki, w przeciwieństwie do zmiennych, nie można ich eksportować, aby uzyskać do nich dostęp w procesach potomnych.

Pierwsze wydane polecenie

files_in_array=( $( find /tmp -type f -name "*.xml" ) )

inicjuje tablicę, jeśli pliki w_pliku zawierały dane, zostaną wyczyszczone.

Jak powiedziano w komentarzach, nie jest to bezpieczny sposób inicjalizacji tablicy tak, jak to zrobiłeś, ponieważ po rozszerzeniu procesu $(..) wynik jest podzielony na tabulatory spacji i znaki nowej linii, a nazwa pliku może być podzielona na elemnty, bezpiecznym sposobem jest użycie rozszerzenia pliku globalnego, ponieważ występuje po nim i nie jest dzielone. Więc tylko

files_in_array=( /tmp/*.xml )

aby uzyskać wszystkie ścieżki podrzędne

shopt -s globstar
shopt -s nullglob
files_in_array=( /tmp/**/*.xml )

jak powiedziano w komentarzach, globstar został wprowadzony w bash 4.0, przed tym innym sposobem na zrobienie tego z find -print0

files_in_array=(  )
while IFS= read -d "" -r file; do
files_in_array+=( "$file" )
done < <( find /tmp -type f -name "*.xml" -print0 )