Bash配列を使ってデータを操作し制御する方法
配列変数は、インデックスを使用して複数の値を格納するためにあらゆるプログラミング言語で使用されます。配列のインデックスは数字または文字列である可能性があります。数値インデックスを含む配列は「数値配列」と呼ばれ、文字列値をインデックスとして含む配列は「連想配列」と呼ばれます。数値配列と連想配列の両方は、Bashで作成できます。このチュートリアルでは、15の例を使用してBash配列のデータを操作および制御する方法を詳しく示します。
- インデックスで配列を定義する
- 複数の値を持つ配列を定義する
- 連想配列を定義する
- 配列の値をカウントする
- ループで配列の値を読み取る
- 配列の特定の値を読み取る
- 配列の値を挿入してください
- ファイルの内容を配列に読み込む
- 配列の値を結合する
- 配列の値を修正する
- 配列の値を削除する
- 配列の値を検索して置き換えます
- 配列を関数の引数として使用する
- 関数から配列を返す
- 配列を空にする
インデックスによる配列の定義
連続または非連続の数値インデックスを指定して配列を宣言する方法は、次のスクリプトに示されています。このタイプの配列は数値配列と呼ばれます。ここで、“ $books ” 配列は三つの連続インデックスを定義することで作成され、“ $products ” 配列は四つの非連続インデックスを定義することで作成されます。両方の配列のすべての値は、“printf” 関数を使用して表示されます。
#!/bin/bash
#Define array index in sequential order
books[0]='Learning the bash Shell'
books[1]='Cybersecurity Ops with bash'
books[2]='Bash Command Line Pro Tips'
echo "All values of the first array:"
printf '%s\n' "${books[@]}"
#Define array index in non-sequential order
products[10]='Pen'
products[5]='Pencil'
products[9]='Rular'
products[4]='A4 Size Paper'
echo
echo "All values of the second array:"
printf '%s\n' "${products[@]}"出力:
スクリプトを実行した後、次の出力が表示されます。両方の配列の値が出力に印刷されます。非連続インデックスの配列の印刷時にインデックスの順序は維持されます。
複数の値を持つ配列を定義する
複数の値を持つ数値配列は、「declare」コマンドの -a オプションを使用して宣言するか、「declare」コマンドを使用せずに宣言できます。以下のスクリプトでは、最初の配列は「declare」コマンドを使用して宣言され、2 番目の配列は「declare」コマンドを使用せずに作成されます。
#!/bin/bash
#Declare a numeric array with the 'declare' keyword
declare -a names=('Michael' 'David' 'Alexander' 'Thomas' 'Robert' 'Richard')
#Print the array values
echo "All values of the first array:"
printf '%s\n' "${names[@]}"
#Declare a numeric array without 'declare' keyword
books=('Shell Scripting Tutorials' 'Bish Bash Bosh!' 'Learn Bash Quickly')
#Add newline
echo
#Print the array values
echo "All values of the second array:"
printf '%s\n' "${books[@]}"出力:
スクリプトを実行後、次の出力が表示されます。ここでは両方の配列の値が印刷されています。
連想配列を定義する
文字列の値をインデックスとして含む配列は、連想配列と呼ばれます。-Aオプションは、Bashの「declare」コマンドとともに使用され、連想Bash配列を作成します。次のスクリプトでは、最初の連想配列はインデックスを別々に指定して宣言され、2番目の配列は配列宣言の際にすべてのキーと値のペアを指定することによって宣言されます。
#!/bin/bash
#Declare an associative array variable without value
declare -A employee
#Assign value separately by defining the index
employee['id']='78564'
employee['name']='Sadia Akter'
employee['post']='CEO'
employee['salary']=300000
#Print two values of the array
echo "Employee ID: ${employee[id]}"
echo "Employee Name: ${employee[name]}"
#Declare an associative array with values
declare -A course=( [code]='CSE-206' [name]='Object Oriented Programming' [credit_hour]=2.0 )
#Add newline
echo
#Print two array values of the second array
echo "Course Name: ${course[name]}"
echo "Credit Hour: ${course[credit_hour]}"出力:
スクリプトを実行した後に次の出力が表示されます。ここでは、キーまたはインデックス値を指定することによって、連想配列の特定の値が印刷されています。
配列の値を数えます
数値配列と連想配列の合計要素をカウントする方法は、以下のスクリプトに示されています:
#!/bin/bash
#Declare a numeric array
declare -a names=('Michael' 'David' 'Alexander' 'Thomas' 'Robert' 'Richard');
echo "The length of the numeric array is ${#names[@]}"
#Declare an associative array
declare -A course=([code]='CSE-206' [name]='Object Oriented Programming' [credit_hour]=2.0)
echo "The length of the associative array is ${#course[@]}"
出力:
スクリプトを実行した後、次の出力が表示されます。ここでは、数値配列と連想配列の配列の長さが印刷されます。
ループで配列の値を読み取る
数値配列と連想配列のすべての値を「for」ループを使用して読み取る方法は、以下のスクリプトに示されています:
#!/bin/bash
#Declare a numeric array
declare -a books=("Shell Scripting Tutorials" "Bish Bash Bosh!" "Learn Bash Quickly")
#Print the numeric array values
echo "Numeric array values are:"
for v in "${books[@]}"
do
echo "$v"
done
echo
#Declare an associative array with values
declare -A clients=(
[id]='H-5623'
[name]='Mr. Ahnaf'
[address]='6/A, Dhanmondi, Dhaka.'
[phone]='+8801975642312')
#Print the associative array values
echo "Associative array values are:"
for k in "${!clients[@]}"
do
echo "$k=>${clients[$k]}"
done出力:
スクリプトを実行した後、次の出力が表示されます。ここでは、数値配列の値と連想配列のキーと値のペアが出力に印刷されます:
配列の特定の値の範囲を読み取る
特定のインデックス範囲の配列値は、以下のスクリプトで示されています。このスクリプトでは、4つの要素から成る数値配列が定義されています。後に配列の2番目のインデックスから2つの配列値が印刷されます。
#!/bin/bash
#Declare a numeric array
declare -a cakes=('Chocolate Cake' 'Vanilla Cake' 'Red Velvet Cake' 'strawberry cake')
#Print the particular array values
echo "The 2nd and 3rd elements of the array values are:"
printf '%s\n' "${cakes[@]:1:2}"出力:
スクリプトを実行した後に次の出力が表示されます。配列の第2および第3の値は「バニラケーキ」と「レッドベルベットケーキ」で、それらは出力に印刷されます:
配列の値を挿入する
配列の末尾に複数の値を追加する方法は、以下のスクリプトに示されています。メインの配列「$books」には3つの要素が含まれており、2つの要素が「$books」配列の末尾に追加されています。
#!/bin/bash
#Declare a numeric array
declare -a books=("Shell Scripting Tutorials" "Bish Bash Bosh!" "Learn Bash Quickly")
#Print the array values before inserting
echo "Array values:"
printf '%s\n' "${books[@]}"
echo
books=("${books[@]}" "Linux Command Line and Shell Scripting Bible" "Advanced Bash Scripting Guide by Mendel Cooper")
#Print the array values after inserting
echo "Array values after inserting two values:"
printf '%s\n' "${books[@]}"出力:
スクリプトを実行した後、以下の出力が表示されます。新しい値を挿入する前と後の配列の値が出力に印刷されます:
ファイルの内容を配列に読み込む
この例のスクリプトをテストするために、次の内容を含む「fruits.txt」という名前のテキストファイルを作成してください:
フルーツ.txt
Mango
Jackfruit
Pineapple
Orange
Banana次のスクリプトでは、ファイルの内容が「$data」という名前の配列に格納されます。ここでは、ファイルの各行が配列の各要素として格納されます。次に、配列の値が印刷されます。
#!/bin/bash
#Read the filename from the user
read -p "Enter the filename:" filename
if [ -f $filename ]
then
#Read the file content into an array"
data=( `cat "$filename" `)
echo "The content of the file is given below:"
#Read the file line by line
for line in "${data[@]}"
do
echo $line
done
fi出力:
スクリプトを実行後、以下の出力が表示されます。「cat」コマンドによって表示される出力とスクリプトの出力は、同じファイルに「cat」コマンドとスクリプトの両方がアクセスしているため、似ています。
配列の値を結合する
複数の配列の値を組み合わせることで新しい配列が作成されます。次のスクリプトでは、2つの数値の文字列配列が定義されています。次に、これらの配列の値を組み合わせて新しい配列が作成されます。
#!/bin/bash
#Declare the first array
declare -a nameList1=('Michael' 'David' 'Alexander' 'Thomas')
echo "The first array values are:"
printf '%s, ' ${nameList1[@]}
echo
#Declare the second array
declare -a nameList2=('Robert' 'Richard')
echo "The second array values are:"
printf '%s, ' ${nameList2[@]}
echo
#Create a new array by combining two arrays
combined_array=("${nameList1[@]}" "${nameList2[@]}")
echo "The combined array values are:"
printf '%s, ' ${combined_array[@]}
echo出力:
スクリプトを実行した後、次の出力が表示されます。ここでは、三つの配列の値が出力に印刷されています。三番目の配列には、最初と二番目の配列のすべての値が含まれています。
配列の値を変更する
インデックスを指定することによって、1つまたは複数の配列値を更新する方法は、次のスクリプトに示されています:
#!/bin/bash
#Declare the first array
declare -a nameList=('Michael' 'David' 'Alexander' 'Thomas')
echo "Array values:"
printf '%s, ' ${nameList[@]}
echo
#Update the 2nd value of the array
nameList[1]='Robert'
echo "Array values after update:"
printf '%s, ' ${nameList[@]}
echo出力:
スクリプトを実行した後に以下の出力が表示されます。メイン配列の値と更新された配列の値が出力に印刷されます:
配列の値を削除する
「unset」コマンドは、特定の要素または配列のすべての要素を削除するために使用されます。以下のスクリプトでは、配列の2番目の要素が削除されます。
#!/bin/bash
#Declare a numeric array
declare -a books=("Shell Scripting Tutorials" "Bish Bash Bosh!" "Learn Bash Quickly")
#Print the array values before removing
echo "Array values:"
printf '%s\n' "${books[@]}"
echo
#Remove the 2nd element
unset books[1]
#Print the array values after remove
echo "Array values after removing the 2nd value:"
printf '%s\n' "${books[@]}"出力:
スクリプトを実行した後、次の出力が表示されます。メイン配列の値と、1つの値を削除した後の配列の値が出力に印刷されます。
配列の値を検索して置き換える
次のスクリプトでは、パターンで定義された検索値が「$names」配列のいずれかの値と一致する場合、配列の特定の値が別の値に置き換えられます。
#!/bin/bash
#Declare the first array
declare -a names=('Michael' 'David' 'Alexander' 'Thomas')
#Print the original array values
echo "Original array values:"
printf '%s\n' "${names[@]}"
#Generate string after replacing the array values
updated_array=${names[@]/Alexander/Richard}
#Print the array values after replace
echo "Array values after replace:"
printf '%s\n' "${updated_array[@]}"出力:
スクリプトを実行した後、次の出力が表示されます。メイン配列の値と、値を置き換えた後の配列の値が出力に印刷されます。
配列を関数の引数として使用する
以下のスクリプトでは、配列変数が関数の引数として渡され、その配列の値が後に印刷されます。
#!/bin/bash
#Declare an array of numbers
declare -a numbers=(10 6 45 13 8)
#Define a function that will take an argument value
func()
{
#Read the first argument
numbers=$1
#Print the array values
echo "Array values:"
printf '%d\n' "${numbers[@]}"
}
#Call the function with the array as an argument
func "${numbers[@]}"出力:
スクリプトを実行した後に次の出力が表示されます:
関数から配列を返す
以下のスクリプトでは、関数が4つの数値引数で呼び出されます。引数の値を使用して配列が作成され、その配列が関数から呼び出し元に返されます。
#!/bin/bash
#Define a function that reads four argument values
func()
{
#Read the argument values
numbers=($1 $2 $3 $4)
#Return the array
echo "${numbers[@]}"
}
#Call the function with three arguments
return_val=$(func 78 45 90 23)
#Store the return value in an array
read -a num <<< $return_val
#Print the values of the returned array
echo "The values of the array are:"
for v in "${num[@]}"
do
echo "$v"
done出力:
スクリプトを実行した後に次の出力が表示されます:
配列を空にする
次のスクリプトは、「unset」コマンドを使用して配列を空にする方法を示しています。配列の値の総数は、配列を空にする前と後で印刷されます。
#!/bin/bash
#Declare an array of numbers
declare -a numbers=(10 6 45 13 80)
echo "Numbers of array values: ${#numbers[@]}"
#Make the array empty
unset numbers
echo "Number of array values after making array empty:${#numbers[@]}"出力:
スクリプトを実行した後に以下の出力が表示されます。配列を空にした後、配列の要素の数は0になりました。
結論
このチュートリアルでは、Bashスクリプトにおける配列変数の宣言、アクセス、修正、および削除の異なる方法を15の簡単な例を使って示しています。このチュートリアルがBashユーザーがBash配列の使用法を詳しく知るのに役立つことを願っています。














