bashの配列
6623 ワード
bashには2つの配列があります.1つはインデックス配列(indexed array)、つまり整数の下付きでインデックス配列で、高度な言語の配列(array)に対応します.もう1つは、関連配列(associative array)、すなわち任意の文字列で要素を検索し、高度な言語のマッピングテーブル(mapまたはhash map)に対応する.bashは1次元配列のみをサポートしますが、配列サイズには制限はありません.インデックス配列の下付き文字は0から始まることに注意してください.また、関連配列はbash 4.0以上のバージョンでのみサポートされています.
インデックス配列を宣言: 関連配列を宣言:
関連配列は、カッコで下付き文字を指定して値を割り当てることができます: インデックス配列は、上記の方法で値を割り当てる(数字で下付き)ほか、下付き値を省略することもできる: .配列は、直接下付きスケールで値を割り当てることもできます: は、参照配列が形式${name[subscript]}を採用し、ここでカッコを大きくするのはbash拡張変数の曖昧さを避けるためである:
取得配列サイズ(結果的に${#arr[@]}と${#arr[*]}に違いはない): 出力配列のすべてのキー値(${!arr[@]}と${!arr[*]}の差: 出力配列のすべての値(注意${arr[@]}と${arr[*]}の差: 一例、印刷配列のマッピング関係:
配列を使用しない場合は、破棄してメモリを解放できます.
配列宣言
は宣言する必要はなく、配列によって変数に直接値を割り当てるだけでよいが、コードが明確であるために、明示的に宣言することができる.# 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
# echo ${arr[foo]} # echo ${arr[0]} # {{0}} ( ): echo $arr
配列全体を巡る
@または*を下付きとして配列にアクセスする場合、bashは配列要素を展開すると考えられる.両者の違いは、変数を二重引用符で囲む場合にのみ、@アクセスですべての要素がリストされ、*アクセスですべての要素が結合され、1つの要素になります.したがって,一般的な配列を巡るタスクでは,@を下付きアクセス配列として拡張すべきである.declare -A arr arr=([hello]=world [a b]="c d") # 2 echo "${#arr[@]}" # 2 echo "${#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
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