パターンが一致した場合のシェルスクリプト

パターンが一致した場合のシェルスクリプト

次の単語を含むファイルがあります。

gl-events_0
gl-events_1
gl-events_2
gl-mx-events_0
gl-mx-events_1
gl-mx-events_2

そのため、gl-eventsのパターンが一致した場合はコマンドAを実行し、パターンがgl-mx-eventsの場合はコマンドBを実行する必要があると思いました。

以下を試しましたが、私には効果がありません

STR='gl-mx-events_0'
SUB='gl-mx-events'
if [[ "$STR" == *"$SUB"* ]]; then
echo "you need to run command B"

私の要件は、実行する必要がある単語に基づいてパターンが一致するかどうかです。

command A --- (only for gl-events_0 ...... gl-events_10)
command B --- (only for gl-mx-events_0 ...... gl-mx-events_10)

誰でもこれを達成する方法を案内できますか?

こんにちは、侍

答え1

このような?

n=1
while IFS= read -r line; do
    if [[ $line = *gl-events* ]]; then
        printf "line %d has gl_events, doing something\n"  "$n"
        # run command A with "$line"
    fi
    if [[ $line = *gl-mx-events* ]]; then
        printf "line %d has gl-mx-events, doing something different\n"  "$n"
        # run command B with "$line"
    fi
    n=$((n+1))
done  < file

ただし、@Pankiのコメントのように、grepキーワードに基づいて行をフィルタリングしてから、xargs必要なコマンドを実行することもできます。たとえば、xargsのGNUバージョンを使用すると、次のようになります。

< file grep ^gl-events_    |xargs -d '\n' -n1 echo "running command A with arg" 
< file grep ^gl-mx-events_ |xargs -d '\n' -n1 echo "running command B with arg" 

(基本的xargsどの入力の空白は入力要素を区別し、引用符とバックスラッシュはどれとも互換性のない方法で解釈されます。-d '\n'入力ラインをそのまま使用するように指示します。 )

関連情報