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