Sök…
Arrayuppdrag
Listuppdrag
Om du känner till Perl, C eller Java kanske du tror att Bash skulle använda kommatecken för att separera matriselement, men detta är inte fallet; istället använder Bash mellanslag:
# Array in Perl
my @array = (1, 2, 3, 4);
# Array in Bash
array=(1 2 3 4)
Skapa en matris med nya element:
array=('first element' 'second element' 'third element')
Prenumerationsuppdrag
Skapa en matris med explicita elementindex:
array=([3]='fourth element' [4]='fifth element')
Uppdrag per index
array[0]='first element'
array[1]='second element'
Tilldelning efter namn (associativ matris)
declare -A array
array[first]='First element'
array[second]='Second element'
Dynamisk tilldelning
Skapa en matris från utgången från andra kommandon, använd till exempel seq för att få ett intervall från 1 till 10:
array=(`seq 1 10`)
Tilldelning från skriptets inmatningsargument:
array=("$@")
Uppdrag inom öglor:
while read -r; do
#array+=("$REPLY") # Array append
array[$i]="$REPLY" # Assignment by index
let i++ # Increment index
done < <(seq 1 10) # command substitution
echo ${array[@]} # output: 1 2 3 4 5 6 7 8 9 10
där $REPLY
alltid är den aktuella ingången
Åtkomst till Array Elements
Skriv ut element på index 0
echo "${array[0]}"
Skriv ut det sista elementet med hjälp av utvidgningssyntax
echo "${arr[@]: -1 }"
Skriv ut det sista elementet med hjälp av prenumerationssyntax
echo "${array[-1]}"
Skriv ut alla element, alla citerade separat
echo "${array[@]}"
Skriv ut alla element som en enda citerad sträng
echo "${array[*]}"
Skriv ut alla element från index 1, alla citerade separat
echo "${array[@]:1}"
Skriv ut tre element från index 1, alla citerade separat
echo "${array[@]:1:3}"
Strängoperationer
Om det hänvisas till ett enda element, är stränghandlingar tillåtna:
array=(zero one two)
echo "${array[0]:0:3}" # gives out zer (chars at position 0, 1 and 2 in the string zero)
echo "${array[0]:1:3}" # gives out ero (chars at position 1, 2 and 3 in the string zero)
så ${array[$i]:N:M}
ger ut en sträng från N
e positionen (börjar från 0) i strängen ${array[$i]}
med M
följande tecken.
Array Längd
${#array[@]}
ger längden på arrayen ${array[@]}
:
array=('first element' 'second element' 'third element')
echo "${#array[@]}" # gives out a length of 3
Detta fungerar också med strängar i enstaka element:
echo "${#array[0]}" # gives out the lenght of the string at element 0: 13
Array Modification
Ändra index
Initiera eller uppdatera ett visst element i matrisen
array[10]="elevenths element" # because it's starting with 0
Bifoga
Ändra matris och lägg till element i slutet om inget abonnemang anges.
array+=('fourth element' 'fifth element')
Byt ut hela matrisen med en ny parameterlista.
array=("${array[@]}" "fourth element" "fifth element")
Lägg till ett element i början:
array=("new element" "${array[@]}")
Föra in
Infoga ett element i ett givet index:
arr=(a b c d)
# insert an element at index 2
i=2
arr=("${arr[@]:0:$i}" 'new' "${arr[@]:$i}")
echo "${arr[2]}" #output: new
Radera
unset
arrayindex med det unset
inbyggda:
arr=(a b c)
echo "${arr[@]}" # outputs: a b c
echo "${!arr[@]}" # outputs: 0 1 2
unset -v 'arr[1]'
echo "${arr[@]}" # outputs: a c
echo "${!arr[@]}" # outputs: 0 2
Sammanfoga
array3=("${array1[@]}" "${array2[@]}")
Detta fungerar också för glesa matriser.
Omindexera en matris
Detta kan vara användbart om element har tagits bort från en matris, eller om du är osäker på om det finns luckor i matrisen. För att återskapa index utan mellanrum:
array=("${array[@]}")
Array Iteration
Array-iteration finns i två smaker, foreach och den klassiska för-loop:
a=(1 2 3 4)
# foreach loop
for y in "${a[@]}"; do
# act on $y
echo "$y"
done
# classic for-loop
for ((idx=0; idx < ${#a[@]}; ++idx)); do
# act on ${a[$idx]}
echo "${a[$idx]}"
done
Du kan också iterera över utgången från ett kommando:
a=($(tr ',' ' ' <<<"a,b,c,d")) # tr can transform one character to another
for y in "${a[@]}"; do
echo "$y"
done
Förstör, radera eller avmarkera en matris
För att förstöra, ta bort eller ställa in en matris:
unset array
För att förstöra, ta bort eller ställa in ett enda arrayelement:
unset array[10]
Associative Arrays
Förklara en associerande grupp
declare -A aa
Det är obligatoriskt att förklara en associerande grupp innan initialisering eller användning.
Initiera element
Du kan initialisera element en i taget enligt följande:
aa[hello]=world
aa[ab]=cd
aa["key with space"]="hello world"
Du kan också initialisera en hel associerande grupp i ett enda uttalande:
aa=([hello]=world [ab]=cd ["key with space"]="hello world")
Få åtkomst till ett associerande arrayelement
echo ${aa[hello]}
# Out: world
Lista associativa matrisnycklar
echo "${!aa[@]}"
#Out: hello ab key with space
Lista associativa matrisvärden
echo "${aa[@]}"
#Out: world cd hello world
Iterera över associerande matrisnycklar och värden
for key in "${!aa[@]}"; do
echo "Key: ${key}"
echo "Value: ${array[$key]}"
done
# Out:
# Key: hello
# Value: world
# Key: ab
# Value: cd
# Key: key with space
# Value: hello world
Räkna associerande arrayelement
echo "${#aa[@]}"
# Out: 3
Lista över initialiserade index
Hämta listan över inialiserade index i en matris
$ arr[2]='second'
$ arr[10]='tenth'
$ arr[25]='twenty five'
$ echo ${!arr[@]}
2 10 25
Looping genom en matris
Vårt exempel array:
arr=(a b c d e f)
Använda en for..in
slinga:
for i in "${arr[@]}"; do
echo "$i"
done
Använda C-stil for
loop:
for ((i=0;i<${#arr[@]};i++)); do
echo "${arr[$i]}"
done
Använda while
loop:
i=0
while [ $i -lt ${#arr[@]} ]; do
echo "${arr[$i]}"
i=$((i + 1))
done
Använd while
loop med numerisk villkorad:
i=0
while (( $i < ${#arr[@]} )); do
echo "${arr[$i]}"
((i++))
done
Med hjälp av en until
slinga:
i=0
until [ $i -ge ${#arr[@]} ]; do
echo "${arr[$i]}"
i=$((i + 1))
done
Använda en until
slinga med numerisk villkorad:
i=0
until (( $i >= ${#arr[@]} )); do
echo "${arr[$i]}"
((i++))
done
Array från sträng
stringVar="Apple Orange Banana Mango"
arrayVar=(${stringVar// / })
Varje utrymme i strängen betecknar ett nytt objekt i den resulterande matrisen.
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[3]} # will print Mango
På liknande sätt kan andra tecken användas för avgränsaren.
stringVar="Apple+Orange+Banana+Mango"
arrayVar=(${stringVar//+/ })
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[2]} # will print Banana
Arrayinsättningsfunktion
Denna funktion kommer att infoga ett element i en matris vid ett givet index:
insert(){
h='
################## insert ########################
# Usage:
# insert arr_name index element
#
# Parameters:
# arr_name : Name of the array variable
# index : Index to insert at
# element : Element to insert
##################################################
'
[[ $1 = -h ]] && { echo "$h" >/dev/stderr; return 1; }
declare -n __arr__=$1 # reference to the array variable
i=$2 # index to insert at
el="$3" # element to insert
# handle errors
[[ ! "$i" =~ ^[0-9]+$ ]] && { echo "E: insert: index must be a valid integer" >/dev/stderr; return 1; }
(( $1 < 0 )) && { echo "E: insert: index can not be negative" >/dev/stderr; return 1; }
# Now insert $el at $i
__arr__=("${__arr__[@]:0:$i}" "$el" "${__arr__[@]:$i}")
}
Användande:
insert array_variable_name index element
Exempel:
arr=(a b c d)
echo "${arr[2]}" # output: c
# Now call the insert function and pass the array variable name,
# index to insert at
# and the element to insert
insert arr 2 'New Element'
# 'New Element' was inserted at index 2 in arr, now print them
echo "${arr[2]}" # output: New Element
echo "${arr[3]}" # output: c
Läser en hel fil i en matris
Läser i ett enda steg:
IFS=$'\n' read -r -a arr < file
Läsa i en slinga:
arr=()
while IFS= read -r line; do
arr+=("$line")
done
Använda mapfile
eller readarray
(som är synonyma):
mapfile -t arr < file
readarray -t arr < file