У меня есть сценарий, в котором я создаю новую переменную, которая будет иметь только 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_bk
включенная в , filex
то мое if
утверждение будет выглядеть так..
...
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
Если вам нужен ответ в одну строку, то используйте:
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 ' ' ,
- печать массива, разделенного запятыми