次の単語を含むファイルがあります。
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'
入力ラインをそのまま使用するように指示します。 )