バッシュアレイ

ここではミッチ・フレイジャーの「の翻訳ですBashの配列linuxjournal.comからは、」。



「標準」* NIXシェルを使用している場合は、アレイの便利なbash機能に慣れていない可能性があります。bashの配列は、P言語(Perl、Python、PHP)やその他のプログラミング言語ほどクールではありませんが、多くの場合便利です。

Bash配列には数値インデックスのみがありますが、それらはオプションです。つまり、すべてのインデックスの値を明示的に定義する必要はありません。エントリを括弧で囲むことにより、配列全体を定義できます。



  arr=(Hello World)


個々のレコードは、使い慣れた構文を使用して定義できます(BASIC(Dijkstraを許してください-翻訳者のメモ)からFortranまで)。



  arr[0]=Hello
  arr[1]=World




ただし、反対は比較的醜いように見えます。特定のエントリを参照する必要がある場合は、次のようにします。



  echo ${arr[0]} ${arr[1]}


マンページから:



ファイルへのフルパスを展開するときの競合を防ぐために、中括弧が必要です。



さらに、次の奇妙な構造が利用可能です。



  ${arr[*]} #    
  ${!arr[*]}#    
  ${#arr[*]}#    
  ${#arr[0]}#    (  )


$ {!arr [*]}はbashに比較的新しく追加されたものであり、元の実装の一部ではありません。次の構成は、配列の簡単な使用例を示しています。「[index] = value」に注意してください。これにより、特定のレコード番号に特定の値を割り当てることができます。



#!/bin/bash

array=(one two three four [5]=five)

echo "Array size: ${#array[*]}"  #   

echo "Array items:" #   
for item in ${array[*]}
do
    printf "   %s\n" $item
done

echo "Array indexes:" #   
for index in ${!array[*]}
do
    printf "   %d\n" $index
done

echo "Array items and indexes:" #      
for index in ${!array[*]}
do
    printf "%4d: %s\n" $index ${array[$index]}
done


:スクリプトを実行すると、次のような出力が生成されます



配列サイズ:5つの



配列項目:



1つの

2

3

4

5



配列のインデックス:



0

1

2

3

5



アレイアイテムとインデックス:



0:1

1:2

2:3

3:4

5:5



なお{arr [*]}のような構成では、「*」の代わりに「@」文字を使用できます。引用されたエントリの展開を除いて、結果は同じになります。 「$ *」と「$ @」は引用符で囲まれたエントリを返し、「$ {arr [*]}」は各エントリを1つの単語として返し、「$ {arr [@]}」は各エントリを個別の単語として返します。



次の例は、引用符と引用符で囲まれていない構成が文字列を返す方法を示しています(これらの文字列にスペースが含まれている場合は特に重要です)。



#!/bin/bash

array=("first item" "second item" "third" "item")

echo "Number of items in original array: ${#array[*]}"
for ix in ${!array[*]}
do
    printf "   %s\n" "${array[$ix]}"
done
echo

arr=(${array[*]})
echo "After unquoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[*]}")
echo "After * quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[@]}")
echo "After @ quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done


起動時の出力:



元の配列のアイテム数:4つの



最初のアイテム

2番目のアイテム

3番目の

アイテム



引用符で囲まれていない展開後:6つの



最初の

アイテム

2番目の

アイテム

3番目の

アイテム



後*引用符付きの展開:1つの



最初のアイテム2番目のアイテム3番目のアイテム



@引用符付きの展開後:4つの



最初のアイテム

2番目アイテム

3番目の

アイテム



All Articles