Escrevendo uma instrução if que pode acomodar múltiplas condições 'ou'

Escrevendo uma instrução if que pode acomodar múltiplas condições 'ou'

Tenho um cenário em que estou criando uma nova variável que terá apenas os servcesvalores de uma lista de valores disponíveis no 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

Aqui está o código que utilizo para criar uma variável servicesque terá apenas os valores que contém serviços.

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

Meu resultado final será um valor delimitado por vírgula mostrado abaixo.

$ cat $Services

alm_service1_ax,alk_service2_av

O problema agora é que o servicevalor continua aumentando filexe não posso estender minha ifdeclaração adicionando ||. Por exemplo, se eu tiver um novo serviço bum_service3_bkincluído filex, minha ifdeclaração ficaria assim.

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

e isso continuará aumentando para cada novo serviceadicionadofilex

Existe uma maneira de escrever uma ifdeclaração para ter uma única condição que possa acomodar múltiplas condições ou alguma maneira melhor de resolver meu problema?

Responder1

Evite loops para processar texto. Aqui:

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

Ou:

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

Responder2

Se você precisar de uma resposta de uma linha, use:

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

OU

se você precisar de sintaxe condicional, poderá fazer como:

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

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

Vai dar como:

alm_service1_ax,alk_service2_av,alk_service5_av,alk_service3_aff,alk_service5_afds

/tmp/filex- é o caminho do seu arquivo

echo "${Services[@]}" | tr ' ' ,- imprimindo array separado por vírgula

informação relacionada