シェルスクリプトにプライマリファイルアレイとセカンダリファイルアレイがあります。どちらの配列もファイル番号を含みます。
#!/bin/bash
pri=(958 955 675 703 936 933 930 927 908 905 902 899 709)
snd=(953 947 943 939 916 915 1023 889 1010 1054 977 970 966)
# directories where we need to compare
primary=/primaries
secondary=/secondaries
echo "primary files: ${pri[@]}"
echo "secondary files: ${snd[@]}"
# now compare files in primary array `pri[@]` with `/primaries` directory. All files in primary array should be present in `/primaries` directory.
# and compare secondary array `snd[@]` with `/secondaries` directory. All files in secondary array should be present in `/secondaries` directory.
# If any of the file is missing, log a message.
これで、プライマリアレイのすべてのファイルがディレクトリpri[@]
に存在し、セカンダリアレイのすべてのファイルがディレクトリに存在する必要があります。両方のディレクトリのファイル名は次のとおりです。ここで、1041はファイル番号です。/primaries
snd[@]
/secondaries
proc_1041_test.data
プライマリ配列ファイル番号をプライマリディレクトリのファイルとどのように比較し、セカンダリディレクトリのファイルも同様に比較しますか?
メモ: /primaries
また、/secondaries
ディレクトリにはサブディレクトリがある可能性があるため、サブディレクトリではなくこれら2つの親ディレクトリでのみファイルを見つけることができます。
答え1
アレイの1つの場合:
for num in "${pri[@]}"; do
name="proc_${num}_test.data"
if [ ! -f "$primary/$name" ]; then
printf '"%s" not found in "%s"\n' "$name" "$primary" >&2
fi
done
つまり、配列の数を繰り返して予想されるファイル名を構成し、予想されるファイル名がディレクトリにあるかどうかをテストします。それ以外の場合は、標準エラーストリームに診断メッセージを書き込みます。
一度に2つのファイルセットを完了します。
set -- "$primary" "$secondary"
typeset -n array
for array in pri snd; do
for num in "${array[@]}"; do
name="proc_${num}_test.data"
if [ ! -f "$1/$name" ]; then
printf '"%s" not found in "%s"\n' "$name" "$1" >&2
fi
done
shift
done
これには名前参照変数が導入されますarray
。にアクセスすると、${array[@]}
名前が割り当てられた変数array
(ループ内の最初、pri
次snd
)にアクセスされます。
ディレクトリ名は位置引数に割り当てられ、$primary
ループの前に使用され、ソースが完了したときにループ内で使用されます。$secondary
$1
$2
set
shift
$2
$1
$1
1は定期的なファイル(またはアクセス可能な一般ファイルへのシンボリックリンク)を使用して、タイプ[ ! -e "$primary/$name" ] && [ ! -L "$primary/$name" ]
に関係なくファイルが存在することを確認するには、に変更します。