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
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"
neboecho "$i=(${ARi]})"
oba dávají něco navíc tím, že ukazují, jak získat klíč & var, ale přísně vzatoecho "$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?
"${array[*]}"
místo"${array[@]}"
. Použití*
místo@
s ním víceméně zachází jako s řetězcem místo s maticí.