配列は、同じ型または異なる型の複数の値を含む変数です。配列のサイズに上限はありません。また、メンバー変数にインデックスを付けたり、連続して割り当てたりする必要もありません。配列インデックスはゼロから始まります。
この記事では、bash での 15 のさまざまな配列操作を確認します。
この記事は、進行中の Bash チュートリアル シリーズの一部です。 Bash スクリプトを初めて使用する方は、Bash スクリプト入門チュートリアルからすぐに始められます。
1.配列の宣言と値の割り当て
bash では、変数が次のような形式で使用されると、配列が自動的に作成されます。
name[index]=value
- name は配列の任意の名前です
- index は、ゼロ以上の数値に評価される任意の数値または式である可能性があります。declare -a arrayname を使用して、明示的な配列を宣言できます。
$ cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${Unix[1]} $./arraymanip.sh Red hat
配列から要素にアクセスするには、${name[index]} のような中かっこを使用します。
2.宣言中の配列の初期化
配列の各要素を個別に初期化する代わりに、要素のリスト (空白で区切られた) を中括弧で指定することにより、配列を宣言して初期化できます。
Syntax: declare -a arrayname=(element1 element2 element3)
要素に空白文字がある場合は、引用符で囲みます。
#! /bin/bash $cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora');
declare -a は配列を宣言し、括弧内の要素はすべて配列の要素です。
3. Bash配列全体を出力
配列の要素全体を出力するには、さまざまな方法があります。インデックス番号が @ または * の場合、配列のすべてのメンバーが参照されます。 bash のループ ステートメントを使用して、配列要素をトラバースして出力できます。
echo ${Unix[@]} # Add the above echo statement into the arraymanip.sh #./t.sh Debian Red hat Ubuntu Suse
インデックス番号を指定せずに配列のメンバー変数の内容を参照することは、インデックス番号 0 で参照される最初の要素の内容を参照することと同じです。
4. Bash 配列の長さ
$# という特別なパラメータを使用して、配列の長さを取得できます。
${#arrayname[@]} は配列の長さを示します。
$ cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Suse' 'Fedora'); echo ${#Unix[@]} #Number of elements in the array echo ${#Unix} #Number of characters in the first element of the array.i.e Debian $./arraymanip.sh 4 6
5.配列の n 番目の要素の長さ
${#arrayname[n]} は、配列の n 番目の要素の長さを指定する必要があります。
$cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${#Unix[3]} # length of the element located at index 3 i.e Suse $./arraymanip.sh 4
6.配列のオフセットと長さによる抽出
次の例は、Unix という配列から 3 番目の位置から始まる 2 つの要素を抽出する方法を示しています。
$cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[@]:3:2} $./arraymanip.sh Suse Fedora
上記の例では、3 番目のインデックスと 4 番目のインデックスの要素が返されます。インデックスは常にゼロから始まります。
7.配列の特定の要素のオフセットと長さによる抽出
配列要素から最初の 4 つの要素だけを抽出する。たとえば、配列の 2 番目のインデックスにある Ubuntu では、配列の特定の要素にオフセットと長さを使用できます。
$cat arraymanip.sh #! /bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[2]:0:4} ./arraymanip.sh Ubun
上記の例は、配列の 2 番目のインデックス要素から最初の 4 文字を抽出します。
8.配列要素の検索と置換
次の例では、配列要素で Ubuntu を検索し、それを「SCO Unix」という単語に置き換えます。
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[@]/Ubuntu/SCO Unix} $./arraymanip.sh Debian Red hat SCO Unix Suse Fedora UTS OpenLinux
この例では、2 番目のインデックス「Ubuntu」の要素を「SCO Unix」に置き換えます。ただし、この例では配列の内容が完全に置き換えられるわけではありません。
9.既存の Bash 配列に要素を追加
次の例は、既存の配列に要素を追加する方法を示しています。
$cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Unix=("${Unix[@]}" "AIX" "HP-UX") echo ${Unix[7]} $./arraymanip.sh AIX
Unix という配列では、要素「AIX」と「HP-UX」がそれぞれ 7 番目と 8 番目のインデックスに追加されます。
10.配列から要素を削除
unset は、配列から要素を削除するために使用されます。unset は、要素に null を割り当てるのと同じ効果があります。
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); unset Unix[3] echo ${Unix[3]}
上記のスクリプトは、3 番目のインデックスで使用可能な値である null を出力するだけです。次の例は、配列から要素を完全に削除する方法の 1 つを示しています。
$ cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); pos=3 Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))}) echo ${Unix[@]} $./arraymanip.sh Debian Red hat Ubuntu Fedora UTS OpenLinux
この例では、${Unix[@]:0:$pos} は 0 番目のインデックス、つまり 0,1,2 から始まる 3 つの要素を提供し、${Unix[@]:4} は 4 番目のインデックスから最後のインデックス。上記の両方の出力をマージします。これは、配列から要素を削除する回避策の 1 つです。
11.パターンを使用して Bash 配列要素を削除する
検索条件でパターンを指定し、以下のように残りの要素を別の配列に格納します。
$ cat arraymanip.sh #!/bin/bash declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora'); declare -a patter=( ${Unix[@]/Red*/} ) echo ${patter[@]} $ ./arraymanip.sh Debian Ubuntu Suse Fedora
上記の例では、パターン Red* を持つ要素を削除します。
12.配列のコピー
以下に示すように、配列要素を展開し、それを新しい配列に格納します。
#!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Linux=("${Unix[@]}") echo ${Linux[@]} $ ./arraymanip.sh Debian Red hat Ubuntu Fedora UTS OpenLinux
13. 2 つの Bash 配列の連結
2 つの配列の要素を展開し、新しい配列に割り当てます。
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); UnixShell=("${Unix[@]}" "${Shell[@]}") echo ${UnixShell[@]} echo ${#UnixShell[@]} $ ./arraymanip.sh Debian Red hat Ubuntu Suse Fedora UTS OpenLinux bash csh jsh rsh ksh rc tcsh 14
配列「Unix」と「Shell」の両方の要素を持つ配列を出力し、新しい配列の要素数は 14 です。
14.アレイ全体の削除
unset は、配列全体を削除するために使用されます。
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); UnixShell=("${Unix[@]}" "${Shell[@]}") unset UnixShell echo ${#UnixShell[@]} $ ./arraymanip.sh 0
配列を設定解除すると、上記のように長さがゼロになります。
15.ファイルの内容を配列にロード
ファイルの内容を 1 行ずつ配列にロードできます。
#Example file $ cat logfile Welcome to thegeekstuff Linux Unix $ cat loadcontent.sh #!/bin/bash filecontent=( `cat "logfile" `) for t in "${filecontent[@]}" do echo $t done echo "Read file content!" $ ./loadcontent.sh Welcome to thegeekstuff Linux Unix Read file content!
上記の例では、配列要素の各インデックスが for ループで出力されています。
推奨読書
Bash 101 ハック、Ramesh Natarajan 著 .私はほとんどの時間を Linux 環境に費やしています。だから当然、私は Bash のコマンド ラインとシェル スクリプトの大ファンです。 15 年前、さまざまな種類の *nix に取り組んでいたとき、C シェルと Korn シェルで多くのコードを記述していました。後年、システム管理者として Linux の作業を開始したとき、Bash シェル スクリプトを使用して、考えられるすべてのタスクをほぼ自動化しました。私の Bash での経験に基づいて、Bash コマンド ラインとシェル スクリプトの両方に関する 101 の実用的な例を含む Bash 101 Hacks eBook を作成しました。 Bash の習得を考えている場合は、ぜひこの本を読んでください。Bash のコマンド ラインとシェル スクリプトを制御するのに役立ちます。