GNU/Linux >> Znalost Linux >  >> Linux

Chování polí ve skriptování bash a shellu zsh (počáteční index 0 nebo 1?)

TL;DR:

  • bash indexování pole začíná na 0 (vždy)
  • zsh indexování pole začíná na 1 (pokud není možnost KSH_ARRAYS je nastaveno)

Chcete-li se vždy chovat konzistentně, použijte:

${array[@]:offset:length}

Vysvětlení

Pro kód, který funguje v obou bash a zsh , musíte použít offset:length syntaxe spíše než [subscript] syntaxe.

Dokonce i pro zsh -pouze kód, budete to muset udělat (nebo použijte emulate -LR zsh ) od zsh základ indexování pole 's je určen KSH_ARRAYS možnost.

Např. odkaz na první prvek v poli:

${array[@]:0:1}

Zde array[@] jsou všechny prvky, 0 je posun (který vždy je založen na 0) a 1 je počet požadovaných prvků.


Pole v Bash jsou indexována od nuly a v zsh jsou indexována od jedné.

Ale pro jednoduchý případ použití, jako je tento, indexy nepotřebujete. Smyčka přes ${array[@]} funguje v obou:

files=(file*)
for f in "${files[@]}"; do
    echo "$f"
done

V zsh můžete také použít $files místo "${files[@]}" , ale to v Bash nefunguje. (A je tu malý rozdíl, že vypustí prázdné prvky pole, ale z názvů souborů žádné nezískáte.)

Také nepoužívejte $(ls file*) , rozbije se, pokud máte názvy souborů s mezerami (viz WordSpliting na BashGuide), a je pro začátek zcela k ničemu.

Shell je dokonale schopen generovat názvy souborů sám. To je vlastně to, co se tam stane, shell najde všechny soubory s názvy odpovídajícími file* , předá je ls a ls jen je znovu vytiskne, aby je shell mohl přečíst a zpracovat.


Linux
  1. Bash pole s příklady

  2. bash:nastavení proměnné env pole a dereferencování z libovolného skriptu shellu selže

  3. Bashová pole a záporné indexy, ano nebo ne?

  1. Jak programovat s Bash:Syntaxe a nástroje

  2. Bash Array Of Arrays?

  3. Jak porovnávat řetězce ve skriptování Bash Shell

  1. 25 Otázky a odpovědi k rozhovoru se skriptováním Linux Shell

  2. Najít a nahradit ve skriptování shellu

  3. Co přesně je <() v bash (a =() v zsh)?