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)

4,0
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]}"
4,3

Skriv ut det sista elementet med hjälp av utvidgningssyntax

echo "${arr[@]: -1 }"
4,3

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)

${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
3,1

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

4,0

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
2,04

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
2,04

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
2,04

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
4,0

Använda mapfile eller readarray (som är synonyma):

mapfile -t arr < file
readarray -t arr < file


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow