Přístup k proměnné indexu pole ze smyčky skriptu bash shell?

Chci přistupovat k proměnné indexu pole při smyčce přes pole v mém skriptu prostředí bash.

myscript.sh

#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in ${AR[*]}; do echo $i done 

Výsledkem výše uvedeného skriptu je:

foo bar baz bat 

Výsledek, který hledám, je:

0 1 2 3 

Jak mohu změnit svůj skript, abych toho dosáhl?

Komentáře

  • Pamatujte také, že v zásadě nikdy chcete "${array[*]}" místo "${array[@]}". Použití * místo @ s ním víceméně zachází jako s řetězcem místo s maticí.

Odpověď

To lze provést pomocí Seznam klíčů pole . Na stránce bash:

${!name[@]}
${!name[*]}

Seznam klíčů pole . Pokud name je proměnná pole, rozbalí se do seznamu indexů pole (klíčů) přiřazených v name. Pokud název není pole, rozbalí se na 0, pokud je nastaven název a jinak null. Když se použije @ a rozšíření se objeví v uvozovkách, každý klíč se rozšíří na samostatné slovo.

Pro váš příklad:

#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done 

Výsledkem bude:

${AR[0]}=foo ${AR[1]}=bar ${AR[2]}=baz ${AR[3]}=bat 

Upozorňujeme, že pracovat pro neseekvující indexy:

#!/bin/bash AR=([3]="foo" [5]="bar" [25]="baz" [7]="bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done 

Výsledkem jsou:

${AR[3]}=foo ${AR[5]}=bar ${AR[7]}=bat ${AR[25]}=baz 

komentáře

  • Ačkoliv tato odpověď dosáhne požadovaného výsledku, je zbytečně zmatena příkazem printf. Například: printf "$i=(${AR[i]})\n" nebo echo "$i=(${ARi]})" oba dávají něco navíc tím, že ukazují, jak získat klíč & var, ale přísně vzato echo "$i" by na OP odpověděl. Zbytek je " bash fu " 🙂
  • Proč to není možné: a=(1 2);echo ${a[0]} # result: 1?

Odpověď

Kromě odpovědi jordanmu můžete také udělat C jako smyčka v bash:

for ((idx=0; idx<${#array[@]}; ++idx)); do echo "$idx" "${array[idx]}" done 

Komentáře

  • Pouze pokud to nebylo řídké pole …

Odpovědět

Můžete udělat něco takového:

 #!/bin/bash AR=("foo" "bar" "baz" "bat") length=${#AR[@]} for (( i = 0; i < length; i++ )); do echo "$i" done  

výstup:

0 1 2 3 

Komentáře

  • Co to říká, že odpověď pfnuesel už neříká?
  • Mohu se mýlit, ale odpověď pfnuesels neodpovídá přehodnocení délky pole při každé iteraci?

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *