bashの配列

6623 ワード

bashには2つの配列があります.1つはインデックス配列(indexed array)、つまり整数の下付きでインデックス配列で、高度な言語の配列(array)に対応します.もう1つは、関連配列(associative array)、すなわち任意の文字列で要素を検索し、高度な言語のマッピングテーブル(mapまたはhash map)に対応する.bashは1次元配列のみをサポートしますが、配列サイズには制限はありません.インデックス配列の下付き文字は0から始まることに注意してください.また、関連配列はbash 4.0以上のバージョンでのみサポートされています.

配列宣言

は宣言する必要はなく、配列によって変数に直接値を割り当てるだけでよいが、コードが明確であるために、明示的に宣言することができる.
  • インデックス配列を宣言:
  • #   declare -a arr #   local -a arr
  • 関連配列を宣言:
  • #   declare -A arr #   local -A arr

    配列の割り当てと参照

  • 関連配列は、カッコで下付き文字を指定して値を割り当てることができます:
  • arr=(["a"]=var1 ["bc"]=var2 ["def"]=var3)
  • インデックス配列は、上記の方法で値を割り当てる(数字で下付き)ほか、下付き値を省略することもできる:
  • .
    arr=(var0 var1 var2 var3)
  • 配列は、直接下付きスケールで値を割り当てることもできます:
  • arr["a"]=var1 arr["bc"]=var2 arr["def"]=var3
  • は、参照配列が形式${name[subscript]}を採用し、ここでカッコを大きくするのはbash拡張変数の曖昧さを避けるためである:
  • #   echo ${arr[foo]} #   echo ${arr[0]} #  {{0}} ( ): echo $arr

    配列全体を巡る

    @または*を下付きとして配列にアクセスする場合、bashは配列要素を展開すると考えられる.両者の違いは、変数を二重引用符で囲む場合にのみ、@アクセスですべての要素がリストされ、*アクセスですべての要素が結合され、1つの要素になります.したがって,一般的な配列を巡るタスクでは,@を下付きアクセス配列として拡張すべきである.
  • 取得配列サイズ(結果的に${#arr[@]}と${#arr[*]}に違いはない):
  • declare -A arr arr=([hello]=world [a b]="c d") #  2 echo "${#arr[@]}" #  2 echo "${#arr[*]}"
  • 出力配列のすべてのキー値(${!arr[@]}と${!arr[*]}の差:
  • declare -A arr arr=([hello]=world [a b]="c d") #   @  ( , ): #    a b #    hello for k in "${!arr[@]}" do     echo "$k" done #   *  , : #    a b hello for k in "${!arr[*]}" do     echo "$k" done
  • 出力配列のすべての値(注意${arr[@]}と${arr[*]}の差:
  • declare -A arr arr=([hello]=world [a b]="c d") #   @  : #    c d #    world for v in "${arr[@]}" do     echo "$v" done #   *  , : #    c d world for v in "${arr[*]}" do     echo "$v" done
  • 一例、印刷配列のマッピング関係:
  • declare -A arr arr=([hello]=world [a b]="c d") #  : #    a b -> c d #    hello -> world for k in "${!arr[@]}" do     echo "$k -> ${arr[${k}]}" done

    配列破棄


    配列を使用しない場合は、破棄してメモリを解放できます.
    #   unset arr[1] #   unset arr unset arr[@] unset arr[*]

    注意事項

    関連配列を使用する場合は、値を割り当てるときに与えられたキー値にスペースがある場合は、引用符を付けるかどうかが異なることに注意してください.引用符を付けた文字列の真ん中のスペースの前に反斜線が付いていて、bashのバグかどうか分かりません.例は次のとおりです.
    declare -A arr #  , , ,  arr=([a b]="c d" ["a b"]="x y") #  : #    a\ b -> x y #    a b -> c d for k in "${!arr[@]}" do     echo "$k -> ${arr[${k}]}" done