GNU/Linux >> Linux の 問題 >  >> Linux

bash スクリプトと zsh シェルでの配列の動作 (開始インデックス 0 または 1?)

TL;DR:

  • bash 配列のインデックスは 0 から始まります (常に)
  • zsh 配列のインデックスは 1 から始まります (オプション KSH_ARRAYS を除く) 設定されています)

常に一貫した動作を得るには、次を使用します:

${array[@]:offset:length}

説明

bash の両方で動作するコードの場合 と zshoffset:length を使用する必要があります [subscript] ではなく構文 構文。

zsh でも -only コード、これを行う必要があります (または emulate -LR zsh を使用します) ) zsh 以降 の配列添字の基準は KSH_ARRAYS によって決定されます オプション。

たとえば、配列の最初の要素を参照するには:

${array[@]:0:1}

ここでは、array[@] すべての要素、0 はオフセットです (常に 0 ベース)、および 1 必要な要素の数です。


Bash の配列は 0 からインデックス付けされ、zsh では 1 からインデックス付けされます。

ただし、このような単純なユース ケースではインデックスは必要ありません。 ${array[@]} をループする 両方で動作します:

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

zsh では $files も使用できます "${files[@]}" の代わりに 、しかしそれはBashでは機能しません。 (そして、空の配列要素をドロップするというわずかな違いがありますが、ファイル名からは何も得られません。)

また、$(ls file*) は使用しないでください。 、ファイル名にスペースが含まれていると壊れてしまい(BashGuideのWordSplitingを参照)、そもそもまったく役に立ちません。

シェルは、それ自体でファイル名を完全に生成できます。シェルは file* に一致する名前を持つすべてのファイルを検索します。 、それらを ls に渡します 、および ls シェルが読み取って処理できるように、それらを再度出力するだけです。


Linux
  1. Bashでプログラミングする方法:構文とツール

  2. 配列のBash配列?

  3. 例を含む Bash 配列

  1. シェルスクリプトでの検索と置換

  2. bash:配列の環境変数を設定し、それをシェル スクリプトから参照解除すると失敗する

  3. bash 配列と負の添字、はいまたはいいえ?

  1. 25Linuxシェルスクリプトインタビューの質問と回答

  2. Bashシェルスクリプトで文字列を比較する方法

  3. <() の bash (および =() の zsh) とは正確には何ですか?