配列要素へのアクセス
では、配列は何の役に立つのでしょうか? 多くのデータ管理タスクをスプレッドシート プログラムで実行できるのと同様に、多くのプログラミング タスクを配列で実行できます。
簡単なデータ収集とプレゼンテーションの例を考えてみましょう。指定されたディレクトリ内のファイルの変更時刻を調べるスクリプトを作成します。このデータから、スクリプトはファイルが最後に変更された時刻を示す表を出力します。このようなスクリプトは、システムが最もアクティブな時間を判断するために使用できます。このスクリプトは、 時は、次の結果を生成します。
[me @ linuxbox〜] $ 時間。
時 |
| 時 |
|
---- | ----- | ---- | ----- |
00 | 0 | 12 | 11 |
01 | 1 | 13 | 7 |
02 | 0 | 14 | 1 |
03 | 0 | 15 | 7 |
04 | 1 | 16 | 6 |
05 | 1 | 17 | 5 |
06 | 6 | 18 | 4 |
07 | 3 | 19 | 4 |
08 | 1 | 20 | 1 |
09 | 14 | 21 | 0 |
10 | 2 | 22 | 0 |
11 | 5 | 23 | 0 |
合計ファイル数 = 80
私たちは、 時 プログラムを実行し、現在のディレクトリをターゲットとして指定します。このプログラムは、0 日の各時間 (23 ~ XNUMX) ごとに、最後に変更されたファイルの数を示す表を生成します。この表を生成するコードは次のとおりです。
#!/ bin / bashに
# 時間: 変更時間の使用状況でファイルをカウントするスクリプト () {
echo "使用法: ${0##*/ ディレクトリ" >&2
}
#!/ bin / bashに
# 時間: 変更時間の使用状況でファイルをカウントするスクリプト () {
echo "使用法: ${0##*/ ディレクトリ" >&2
}
# 引数がディレクトリであることを確認する if [[ ! -d $1 ]]; then
使用法終了 1
fi
# 配列を初期化する
i が {0..23} の場合; 時間[i]=0; 完了
# データを収集する
i を $(stat -c %y "$1"/* | cut -c 12-13); j=${i/#0} とします
((++時間[j])) ((++カウント))
行われ
# データを表示
echo -e "Hour\tFiles\tHour\tFiles" echo -e "----\t-----\t-----" for i in {0..11}; 実行する
j=$((i + 12))
printf "%02d\t%d\t%02d\t%d\n" $i ${hours[i]} $j ${hours[j]} 完了
printf "\n合計ファイル数 = %d\n" $count
# 引数がディレクトリであることを確認する if [[ ! -d $1 ]]; then
使用法終了 1
fi
# 配列を初期化する
i が {0..23} の場合; 時間[i]=0; 完了
# データを収集する
i を $(stat -c %y "$1"/* | cut -c 12-13); j=${i/#0} とします
((++時間[j])) ((++カウント))
行われ
# データを表示
echo -e "Hour\tFiles\tHour\tFiles" echo -e "----\t-----\t-----" for i in {0..11}; 実行する
j=$((i + 12))
printf "%02d\t%d\t%02d\t%d\n" $i ${hours[i]} $j ${hours[j]} 完了
printf "\n合計ファイル数 = %d\n" $count
スクリプトは1つの関数(使用) と 4 つのセクションからなる本体で構成されます。最初のセクションでは、コマンド ライン引数があり、それがディレクトリであるかどうかを確認します。そうでない場合は、使用方法メッセージを表示して終了します。
2番目のセクションでは配列を初期化します 時これは各要素にゼロの値を割り当てることによって行われます。使用前に配列を準備する必要はありませんが、スクリプトでは要素が空にならないようにする必要があります。ループが構築されている興味深い方法に注目してください。中括弧展開({0..23})を使用すると、 の
次のセクションでは、 STAT ディレクトリ内の各ファイルに対してプログラムを実行します。 cut 結果から00桁の時間を抽出します。ループ内では、シェルが「09」から「34」までの値を2進数として解釈しようとするため(最終的には失敗するため)、時間フィールドから先頭のゼロを削除する必要があります(表XNUMX-XNUMXを参照)。次に、XNUMX日の時間に対応する配列要素の値をインクリメントします。最後に、カウンター(カウント) を使用して、ディレクトリ内のファイルの総数を追跡します。
スクリプトの最後のセクションでは、配列の内容を表示します。最初にいくつかのヘッダー行を出力し、次に 4 列の出力を生成するループに入ります。最後に、ファイルの最終的な合計を出力します。