hur räknar man längden på en array definierad i bash?

Jag är nybörjad och kan inte hitta en bra handledning för att svara på min fråga.

array=( item1 item2 item3 ) for name in ${array[@]}; do echo current/total ... some other codes done 

Jag vill beräkna värdet current och total, eftersom den förväntade utgången av detta är:

1/3 2/3 3/3 

Tack för alla typer av tips.

Kommentarer

  • Observera att du bör lägga ${array[@]} i dubbla citat. Annars kommer orduppdelning att utföras och du får oönskade resultat på ingångar som array=("item 1" "item 2" "item 3").

Svar

Du kan komma åt arrayindexen med ${!array[@]} och arrayens längd med ${#array[@]} , t.ex :

#!/bin/bash array=( item1 item2 item3 ) for index in ${!array[@]}; do echo $index/${#array[@]} done 

Observera att eftersom bash-matriser är nollindexerade får du faktiskt:

0/3 1/3 2/3 

Om du vill att räkningen ska gå från 1 kan du ersätta $index med $((index+1)). Om du vill ha värdena samt indexen kan du använda "${array[index]}" dvs.

#!/bin/bash array=( item1 item2 item3 ) for index in ${!array[@]}; do echo $((index+1))/${#array[@]} = "${array[index]}" done 

ger

1/3 = item1 2/3 = item2 3/3 = item3 

Kommentarer

  • Om jag vill få 1,2,3, kan Jag gör det här: echo ($index+1)/${#array[@]}?
  • btw, det verkar som att jag på det här sättet kan ' t få artikel1, item2, item3 i slingan. Jag har fortfarande annan kod för att hantera objekt1, artikel2, artikel3 grejer. Tack,
  • Se redigerat inlägg.

Svar

Ett nollindex är helt giltigt om du tänker på att indexet faktiskt är en förskjutning från basadressen till en matris. Det är faktiskt normen, även om det varierar från dialekt till dialekt. Med det gamla joviala språket innehöll [0] faktiskt den maximala storleken på matrisen. Så det började med [1].

Med vissa grundläggande implementeringar kan du godtyckligt välja att ha antingen 0 eller 1 som första index. Och åtminstone en Basic gör att du kan ange matriser för att indexera [n] till [m]. där n och m kan ha något heltal, även negativt, så länge som n är mindre än eller lika med m. Värdet n dem subtraheras från [index] som anges som index-n = 0 om index motsvarar n.

Men du kan göra samma sak och mer i din egen kod Du kan till och med vända ordern av en matris på detta sätt:

dim array(0, abs(m-n)); step=sign(m-n); if n > m then base=m else base=n; fi 

Detta kodexempel är faktiskt bara delvis på ett språk. Jag ville bara att det skulle vara mer läsbart. Stegvariabeln används för att kontrollera den uppenbara riktningen du rör dig i positiv eller negativ, och används för att beräkna det effektiva indexet när du går in i eller kommer ut ur arrayen, vilket faktiskt alltid är positivt från [0].

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *