ウェブサイト検索

Bashスクリプトで配列を使用する方法


配列は多くの作業を簡素化することができ、特に複数のファイルにわたってアクションを繰り返す必要があるときに便利です。bashスクリプトでの使用方法を見つけてください。

ほとんどのプログラミング言語と同様に、bashスクリプトは時々関連する値のリストを扱う必要があります。最も単純な形は標準の配列です。

Bashにおける配列プログラミングは、特に構文に関して非常に異なります。Bashの配列は厳密に一方向ですが、それでも多くの用途があります。

Bash配列の基本構文

Bashで配列を作成するのは簡単です。角括弧を使って配列全体を初期化できます。例えば、次のようにします:

city=(London Paris Milan "New York")

(この都市の例に関するすべてのコードは、このGitHub Gistにあります。)

これは0から3までインデックスが付けられた4つの要素を含む配列を作成します。4番目の値は2語から成る引用符で囲まれた文字列であることに注意してください。スペースを含む値は、それが別々の値でないことを明確にするために引用する必要があります。

プログラミング言語で一般的なブラケット構文を使用して、単一の要素にアクセスできます:

city[2]

これはbashなので、実際に値を式で使用するにはいくつかの改良が必要です。

  • 変数名の前にドル記号($)を付ける必要があります。
  • 変数名を明確にするために、中括弧({})を使用する必要があります。デフォルトでは、bashは$city[2]を変数名cityとして扱います。ブラケットとインデックス番号も評価するようにbashに指示するために、中括弧を追加してください。

標準的なbash配列アクセス構文は次のようになります:

${variable_name[index]}

こちらが完全な例です:

#!/bin/bash
    
city=(London Paris Milan "New York")
echo ${city[3]}
    
New York

配列を一度に初期化する代わりに、段階的に割り当てることができます。このスクリプトは前の例の長い同等物です:

#!/bin/bash
    
city[0]=London
city[1]=Paris
city[2]=Milan
city[3]="New York"
echo ${city[3]}
   
New York

いずれの場合でも、等号の周りにスペースを追加しないように注意してください。「city[0]=London」と等号の周りにスペースがあると、エラーが発生します。

Bash配列のさらなる用途

配列は関連データを保存するのに最適です。ここに数値の平方根を取得するための(非常に限られた)シェルスクリプトがあります:

#!/bin/bash
    
sqrt[1]=1
sqrt[4]=2
sqrt[9]=3
sqrt[16]=4
sqrt[25]=5
    
echo ${sqrt[$1]}

このスクリプトは値$1を配列のインデックスとして使用しています。$1はスクリプトが受け取る最初のコマンドライン引数を表しているので、次のようにこのスクリプトを実行できます:

./sqrt.sh 9
3

コマンドを実行し、その出力を変数に保存するための$ (cmd)構文を知っているかもしれません。これを配列初期化構文と組み合わせることで、操作するファイルの配列を取得できます:

arr=( $(ls) )

配列は、反復処理を行うのにしばしば完璧なデータ構造であり、Bashも例外ではありません。配列をループしてすべての要素を印刷したり、すべてのメンバーに対して操作を実行したりすることがあります。

配列の内容を反復するために、for .. in ループで配列にアクセスできます。たとえば、配列 arr 内の各ファイルの行数を出力する単純なループは次のとおりです:

for file in "${arr[@]}"; do
    wc -l "$file"
done
    
3 envvars
547 httpd.conf
...

このパターンは、配列からすべての要素を取得するために@記号を使用していることに注意してください。

より多くのBash配列構文

配列内のアイテムの数を取得するには、次のようにします:

echo ${#city[@]}
    
4

標準の配列の末尾に新しい要素を追加するには、次のようにします:

arr+=(4)

したがって、リストに5番目の都市を追加するには:

city+=(Rome)
echo ${city[@]}
    
London Paris Milan New York Rome

配列の一部を抽出するには、多くの他の言語のスライス操作に似た構文を使用できます:

${arr[@]:s:n}

この構文は、位置sから始まり、n個のアイテムを含む配列のスライスを返します。:nの部分を省略すると、sからリストの末尾までのすべてのアイテムを抽出できます。

echo ${city[@]:2:2}
Milan New York
    
echo ${city[@]:3}
New York Rome

Bashには多くの機能がありますが、それらを学ぶには少し時間がかかります。

Bashの配列には制限があるかもしれませんが、ほとんどのプログラミング言語と同じ基本機能を提供します。Bashは歴史的にシンプルな一次元配列のみをサポートしてきましたが、時代は変わっています。最新のBashバージョン4では、連想配列と負の配列インデックスがサポートされています。

使用しているbashのバージョンに関係なく、そのニュアンスを理解することが重要です。通常の変数の構文でさえ、多くの特異性があります。

関連記事: