サーチ…
配列の割り当て
リスト割り当て
Perl、C、またはJavaに精通している場合は、Bashがコンマを使用して配列要素を区切ると考えるかもしれませんが、そうではありません。代わりに、Bashはスペースを使用します:
# Array in Perl
my @array = (1, 2, 3, 4);
# Array in Bash
array=(1 2 3 4)
新しい要素で配列を作成する:
array=('first element' 'second element' 'third element')
下付き文字の割り当て
明示的な要素インデックスを持つ配列を作成する:
array=([3]='fourth element' [4]='fifth element')
インデックスによる割当
array[0]='first element'
array[1]='second element'
名前による割り当て(連想配列)
declare -A array
array[first]='First element'
array[second]='Second element'
動的割り当て
seqを使用して1から10の範囲を取得するなど、他のコマンドの出力から配列を作成します。
array=(`seq 1 10`)
スクリプトの入力引数からの割り当て:
array=("$@")
ループ内の割り当て:
while read -r; do
#array+=("$REPLY") # Array append
array[$i]="$REPLY" # Assignment by index
let i++ # Increment index
done < <(seq 1 10) # command substitution
echo ${array[@]} # output: 1 2 3 4 5 6 7 8 9 10
$REPLY
は常に現在の入力です
配列要素へのアクセス
インデックス0の要素を出力する
echo "${array[0]}"
部分文字列展開構文を使用して最後の要素を出力する
echo "${arr[@]: -1 }"
添字構文を使用して最後の要素を出力する
echo "${array[-1]}"
個別に引用されたすべての要素を印刷する
echo "${array[@]}"
すべての要素を単一引用符で囲んだ文字列として出力する
echo "${array[*]}"
インデックス1のすべての要素を印刷します。それぞれ別々に引用されます。
echo "${array[@]:1}"
インデックス1の3つの要素をそれぞれ別々に表示する
echo "${array[@]:1:3}"
文字列操作
1つの要素を参照する場合、文字列操作は許可されます。
array=(zero one two)
echo "${array[0]:0:3}" # gives out zer (chars at position 0, 1 and 2 in the string zero)
echo "${array[0]:1:3}" # gives out ero (chars at position 1, 2 and 3 in the string zero)
${array[$i]:N:M}
は、文字列${array[$i]}
のN
番目の文字列(0から始まる)に続くM
N
文字列を出力します。
配列の長さ
${#array[@]}
は配列${array[@]}
の長さを${array[@]}
ます。
array=('first element' 'second element' 'third element')
echo "${#array[@]}" # gives out a length of 3
これは、単一要素の文字列でも機能します。
echo "${#array[0]}" # gives out the lenght of the string at element 0: 13
配列の変更
変更インデックス
配列内の特定の要素を初期化または更新する
array[10]="elevenths element" # because it's starting with 0
追加する
配列を修正し、添え字が指定されていない場合は最後に要素を追加します。
array+=('fourth element' 'fifth element')
配列全体を新しいパラメータリストに置き換えます。
array=("${array[@]}" "fourth element" "fifth element")
最初に要素を追加する:
array=("new element" "${array[@]}")
インサート
指定されたインデックスに要素を挿入する:
arr=(a b c d)
# insert an element at index 2
i=2
arr=("${arr[@]:0:$i}" 'new' "${arr[@]:$i}")
echo "${arr[2]}" #output: new
削除
unset
組み込み関数を使用して配列インデックスを削除する:
arr=(a b c)
echo "${arr[@]}" # outputs: a b c
echo "${!arr[@]}" # outputs: 0 1 2
unset -v 'arr[1]'
echo "${arr[@]}" # outputs: a c
echo "${!arr[@]}" # outputs: 0 2
マージ
array3=("${array1[@]}" "${array2[@]}")
これはまばらな配列に対しても機能します。
配列の再索引付け
これは、要素が配列から削除されている場合、または配列にギャップがあるかどうかわからない場合に便利です。ギャップのないインデックスを再作成するには:
array=("${array[@]}")
配列の反復
配列の反復には、foreachと古典的なforループという2つの味があります。
a=(1 2 3 4)
# foreach loop
for y in "${a[@]}"; do
# act on $y
echo "$y"
done
# classic for-loop
for ((idx=0; idx < ${#a[@]}; ++idx)); do
# act on ${a[$idx]}
echo "${a[$idx]}"
done
また、コマンドの出力を反復することもできます。
a=($(tr ',' ' ' <<<"a,b,c,d")) # tr can transform one character to another
for y in "${a[@]}"; do
echo "$y"
done
配列の破棄、削除、または設定解除
配列を破棄、削除、または設定解除するには:
unset array
単一の配列要素を破棄、削除、または設定解除するには:
unset array[10]
連想配列
連想配列を宣言する
declare -A aa
初期化または使用の前に連想配列を宣言することは必須です。
要素を初期化する
次のように、要素を一度に1つずつ初期化することができます。
aa[hello]=world
aa[ab]=cd
aa["key with space"]="hello world"
1つのステートメントで連想配列全体を初期化することもできます。
aa=([hello]=world [ab]=cd ["key with space"]="hello world")
連想配列要素にアクセスする
echo ${aa[hello]}
# Out: world
連想配列キーのリスト表示
echo "${!aa[@]}"
#Out: hello ab key with space
連想配列値のリスト表示
echo "${aa[@]}"
#Out: world cd hello world
連想配列キーと値を繰り返し処理する
for key in "${!aa[@]}"; do
echo "Key: ${key}"
echo "Value: ${array[$key]}"
done
# Out:
# Key: hello
# Value: world
# Key: ab
# Value: cd
# Key: key with space
# Value: hello world
連想配列要素をカウントする
echo "${#aa[@]}"
# Out: 3
初期化されたインデックスのリスト
配列内の初期化されたインデックスのリストを取得する
$ arr[2]='second'
$ arr[10]='tenth'
$ arr[25]='twenty five'
$ echo ${!arr[@]}
2 10 25
配列をループする
私たちの例の配列:
arr=(a b c d e f)
for..in
ループを使う:
for i in "${arr[@]}"; do
echo "$i"
done
Cスタイルfor
ループの使用:
for ((i=0;i<${#arr[@]};i++)); do
echo "${arr[$i]}"
done
while
ループの使用:
i=0
while [ $i -lt ${#arr[@]} ]; do
echo "${arr[$i]}"
i=$((i + 1))
done
数値条件付きwhile
ループの使用:
i=0
while (( $i < ${#arr[@]} )); do
echo "${arr[$i]}"
((i++))
done
until
ループを使う:
i=0
until [ $i -ge ${#arr[@]} ]; do
echo "${arr[$i]}"
i=$((i + 1))
done
数値条件付きのuntil
ループの使用:
i=0
until (( $i >= ${#arr[@]} )); do
echo "${arr[$i]}"
((i++))
done
文字列からの配列
stringVar="Apple Orange Banana Mango"
arrayVar=(${stringVar// / })
ストリング内の各スペースは、結果の配列内の新しい項目を示します。
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[3]} # will print Mango
同様に、区切り文字には他の文字を使用できます。
stringVar="Apple+Orange+Banana+Mango"
arrayVar=(${stringVar//+/ })
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[2]} # will print Banana
配列挿入関数
この関数は、あるインデックスの配列に要素を挿入します:
insert(){
h='
################## insert ########################
# Usage:
# insert arr_name index element
#
# Parameters:
# arr_name : Name of the array variable
# index : Index to insert at
# element : Element to insert
##################################################
'
[[ $1 = -h ]] && { echo "$h" >/dev/stderr; return 1; }
declare -n __arr__=$1 # reference to the array variable
i=$2 # index to insert at
el="$3" # element to insert
# handle errors
[[ ! "$i" =~ ^[0-9]+$ ]] && { echo "E: insert: index must be a valid integer" >/dev/stderr; return 1; }
(( $1 < 0 )) && { echo "E: insert: index can not be negative" >/dev/stderr; return 1; }
# Now insert $el at $i
__arr__=("${__arr__[@]:0:$i}" "$el" "${__arr__[@]:$i}")
}
使用法:
insert array_variable_name index element
例:
arr=(a b c d)
echo "${arr[2]}" # output: c
# Now call the insert function and pass the array variable name,
# index to insert at
# and the element to insert
insert arr 2 'New Element'
# 'New Element' was inserted at index 2 in arr, now print them
echo "${arr[2]}" # output: New Element
echo "${arr[3]}" # output: c
ファイル全体を配列に読み込む
1つのステップで読む:
IFS=$'\n' read -r -a arr < file
ループで読む:
arr=()
while IFS= read -r line; do
arr+=("$line")
done
mapfile
またはreadarray
使用(これは同義語です):
mapfile -t arr < file
readarray -t arr < file