GNU/Linux >> Linux の 問題 >  >> Linux

Bash初心者シリーズ#4:Bashでの配列の使用

アレイが救いの手を差し伸べます!

これまで、bashスクリプトで使用した変数の数は限られており、1つまたは2つのファイル名とユーザー名を保持するための変数をいくつか作成しました。

しかし、bashスクリプトに少数以上の変数が必要な場合はどうでしょうか。ユーザーからの100の異なる入力を読み取るbashスクリプトを作成するとしますが、100の変数を作成しますか?

幸いなことに、アレイははるかに優れたソリューションを提供するため、そうする必要はありません。

bashスクリプトで最初の配列を作成する

bashスクリプトを作成するとしますtimestamp.sh これにより、5つの異なるファイルのタイムスタンプが更新されます。

まず、5つの異なる変数を使用するという単純なアプローチを使用します。

#!/bin/bash

file1="f1.txt"
file2="f2.txt"
file3="f3.txt"
file4="f4.txt"
file5="f5.txt"

touch $file1
touch $file2
touch $file3
touch $file4
touch $file5

ここで、5つの変数を使用して5つのファイル名の値を格納する代わりに、すべてのファイル名を保持する配列を作成します。これがbashの配列の一般的な構文です。

array_name=(value1 value2 value3 … )

これで、 timestamp.shで使用した5つのファイル名すべてを格納するfilesという名前の配列を作成できます。 次のようなスクリプト:

files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")

ご覧のとおり、5つの変数を1つの配列に置き換えたため、これははるかにクリーンで効率的です。

bashの配列要素へのアクセス

配列の最初の要素は、インデックス0から始まります。 したがって、配列のn番目の要素にアクセスするには、n -1を使用します。 索引。

たとえば、ファイル配列の2要素の値を出力するには、次のechoステートメントを使用できます。

echo ${files[1]}

ファイル配列の3要素の値を出力するには、次を使用できます。

echo ${files[2]}

など。

次のbashスクリプトreverse.sh 最後の配列要素から始めて、ファイル配列内の5つの値すべてを逆の順序で出力します:

#!/bin/bash

files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")

echo ${files[4]}
echo ${files[3]}
echo ${files[2]}
echo ${files[1]}
echo ${files[0]}

なぜこれほど多くのechoステートメントがあり、なぜここでループを使用しないのか疑問に思われるかもしれません。これは、このシリーズの後半でbashループの概念を紹介する予定であるためです。 。

すべての配列要素を一度に印刷することもできます:

echo ${files[*]}

f1.txt f2.txt f3.txt f4.txt f5.txt

ファイルの配列要素の総数、つまり配列のサイズを出力できます。 :

echo ${#files[@]}

5

配列の任意の要素の値を更新することもできます。たとえば、次の割り当てを使用して、ファイル配列の最初の要素の値を「a.txt」に変更できます。

files[0]="a.txt"

bashに配列要素を追加する

人気のあるLinuxディストリビューションの名前を含む配列を作成しましょう:

distros=("Ubuntu" "Red Hat" "Fedora")

ディストリビューション配列currentには3つの要素が含まれています。 +=を使用できます 配列の最後に要素を追加(追加)する演算子。

たとえば、次のようにKaliをdistros配列に追加できます。

distros+=("Kali")

これで、distros配列には正確に4つの配列要素が含まれ、Kaliが配列の最後の要素になります。

bashの配列要素を削除する

まず、1から5までの数値を格納するnum配列を作成しましょう:

num=(1 2 3 4 5)

num配列のすべての値を出力できます:

echo ${num[*]}

1 2 3 4 5

unsetを使用して、num配列の3要素を削除できます。 組み込みのシェル:

unset num[2]

ここで、num配列のすべての値を出力すると、次のようになります。

echo ${num[*]}
1 2 4 5

ご覧のとおり、配列numの3番目の要素が削除されています。

同じ方法でnum配列全体を削除することもできます:

unset num
さまざまなデータ型のハイブリッドアレイを作成する

bashでは、他の多くのプログラミング言語とは異なり、さまざまなデータ型を含む配列を作成できます。次のuser.shをご覧ください。 bashスクリプト:

#!/bin/bash

user=("john" 122 "sudo,developers" "bash")

echo "User Name: ${user[0]}"
echo "User ID: ${user[1]}"
echo "User Groups: ${user[2]}"
echo "User Shell: ${user[3]}"

ユーザー配列には4つの要素が含まれていることに注意してください。

  1. "John"---->文字列データ型
  2. 122--->整数データ型
  3. "sudo、developers"--->文字列データ型
  4. "bash"--->文字列データ型

したがって、異なるデータ型を同じ配列に格納することはまったく問題ありません。それは素晴らしいことではありませんか?

これで、このチュートリアルは終了です。楽しんでいただけたでしょうか!より複雑で実際の例が必要な場合は、配列を使用してbashで文字列を分割する方法を確認してください。

そしてもちろん、問題を解決することで学んだことを実践し、行き詰まったりヒントが必要な場合は解決策を参照することもできます。

Bash第4章練習問題Bash配列を練習するための問題とその解決策Bash-Chapter-4-Practice-Questions-Linux-Handbook.pdf29KB

次の章では、さまざまなbash算術演算子の使用方法を説明します。

読み込んでいます...
Linux
  1. SedでBash文字列変数への参照を使用しますか?

  2. 配列のBash配列?

  3. Bash初心者シリーズ#9:Bashでの関数の使用

  1. Bash初心者シリーズ#8:Bashのループ

  2. 例を含む Bash 配列

  3. Bash の配列が見つかりません

  1. Bashの文字列/配列から一意の要素の配列を作成するにはどうすればよいですか?

  2. bashを使用して、ファイルの各行の先頭にある空白を削除します

  3. Linux で Bash を使用してすべての出力をファイルにリダイレクトしますか?