Bashスクリプトモードが見つかりません

Bashスクリプトモードが見つかりません

次のスクリプトがあります。

#!/bin/bash
result=$(grep "pattern 1\|pattern 2\|pattern 3\|pattern 4\|pattern 5\|pattern 6\|pattern 7\|pattern 8" file_data.dat)

if [ -n "$result" ]; then
    printf '%s\n' "$result"
else
    printf 'No match found for pattern "%s"\n' "$pattern"
fi

動作しますが、問題があります。パターンの1つが一致しない場合は知りたいです。どのパターンの不一致。

私も次のことを試しました。

#!/bin/bash

if
        grep "pattern 1\|pattern 2\|pattern 3\|pattern 4\|pattern 5\|pattern 6\|pattern 7\|pattern 8" file_data.dat
then
echo "All patterns found"
else
echo "Missing pattern"
fi

しかし、同じ問題があります。

答え1

考えてみてください:

#!/bin/bash -
patterns=('pattern1' 'pattern2' 'pattern3' 'pattern4' '...')

for pat in "${patterns[@]}"; do
    if ! grep -q -e "$pat" infile; then
        ((missed++))
        printf '%s\n' "pattern $pat not found"
    fi
done
if [[ -z "$missed" ]]; then
    printf '%s\n' 'all patterns were found'
else
    printf 'Among %d patterns, %d patterns were not found\n' "${#patterns[@]}" "$missed"
fi                       

すべてのパターンを の配列に保存patterns=( ... )し、配列のパターンを繰り返し、grepを使用して一致することを確認します。パターンが一致すると自動的に終了し、そうでなければパターンが見つからないと報告して増加します。missed一時変数を1ずつ減らします。

ループ外で一時変数が設定されていないことを確認してください。つまり、すべてのパターンが見つかって報告されたことを意味します。それ以外の場合は、パターン全体に欠落しているパターンの数を印刷します。

関連情報