複数の「または」条件に対応できるif文を書く

複数の「または」条件に対応できるif文を書く

servcesで使用可能な値のリストにある値のみを持つ新しい変数を作成するシナリオがありますfilex

$ cat filex

all_name1_db
all_name2_dm
alm_service1_ax
all_name3_du
alz_name4_dx
ali_name5_dk
alk_service2_av
alf_name6_df
alj_name7_dq

services以下は、サービスが含まれる値のみを含む変数を作成するために使用するコードです。

for x in $filex
do
 if [[ $x == *"service1"* ]] || [[ $x == *"service2"* ]];then
   Services+=$x","
 fi
done

最終結果は、以下に示すコンマ区切りの値になります。

$ cat $Services

alm_service1_ax,alk_service2_av

ここで問題となるのは、 のservice値が引き続き増加し、 を追加してステートメントfilexを拡張できないことです。たとえば、に という新しいサービスが含まれている場合、ステートメントは次のようになります。if||bum_service3_bkfilexif

...
 if [[ $x == *"service1"* ]] || [[ $x == *"service2"* ]] || [[ $x == *"service3"* ]] ;then
...

serviceそして、これは新しいものが追加されるたびに増加し続けるでしょうfilex

if複数の条件に対応できる単一の条件を持つステートメントを記述する方法、または問題に対処するためのより良い方法はありますか?

答え1

テキスト処理のループを避ける。 ここ:

grep 'service[123]' filex | paste -sd , -

または:

grep 'service1
service2
service3' filex | paste -sd , -

答え2

1行の回答が必要な場合は、以下を使用します。

grep "service" filex | xargs echo | sed 's/ /, /g'

または

条件付き構文が必要な場合は、次のようにします。

while read -r line
do
if [[ $line == *"service"* ]]
then
   Services+=("$line")
fi
done < "/tmp/filex"

echo "${Services[@]}" | tr ' ' ,

次のような結果になります:

alm_service1_ax,alk_service2_av,alk_service5_av,alk_service3_aff,alk_service5_afds

/tmp/filex- ファイルのパス

echo "${Services[@]}" | tr ' ' ,- カンマ区切りの配列を印刷する

関連情報