Напечатать совпадение не найдено только один раз после повторения всех целых чисел из входного файла в сценарии оболочки

Я знаю, что есть способ сделать это, но сейчас я не могу вспомнить. У меня есть небольшой сценарий оболочки с простым циклом while, который выполняет итерацию по CSV-файлу и имеет внутри него цикл if else. Проблема заключается в том, что для каждой строки цикл while повторяет оператор if else, который печатает не найденное совпадение до тех пор, пока не найдет совпадение, или продолжает печатать совпадение, пока не будет достигнут конец файла. Я хотел проверить, как я могу распечатать несоответствие, найденное только один раз после повторения всего файла. Вот мой пример кода ниже

while IFS=, read -r path servicename app text1 text2 text3;
do
    text1 = "$key1"
    text2 = "$key2"
    text3 = "$key3"

    if [[ $servicename = $SERVICE_NAME ]];
    then
        if [[ $ENV = "sb" ]]; then
            ID = "$key1"
        elif [[ $ENV = "lb" ]]; then
            ID = "$key2"
        elif [[ $ENV = "dev" ]]; then
            ID = "$key3"
        fi
    else
        echo "no match found"
    fi
done < $input_file

выборочные данные, которые используются в итерации

path,service,app,text1,text2,text3
path/of/service1,servicename1,appname,key1,key2,key3
path/of/service2,servicename2,appname,key1,key2,key3
path/of/service3,servicename3,appname,key1,key2,key3
path/of/service4,servicename4,appname,key1,key2,key3
path/of/service5,servicename5,appname,key1,key2,key3

Пожалуйста, опубликуйте некоторые примеры данных с соответствующим ожидаемым результатом. Не публикуйте их в виде комментариев, изображений, таблиц или ссылок на сторонние сервисы, а используйте текст и включайте их в исходный вопрос. Спасибо.

James Brown 11.05.2022 21:41

то, что вы хотите сделать, это создать флаг, который содержит «независимо от того, нашел ли он что-то» вне цикла, инициализированного значением «false». Затем, после того, как вы найдете то, что действительно хотите напечатать, переключите его на «true». После того, как вы закончите цикл, проверьте, является ли флаг «ложным», и если он печатает «не найдено» в конце

Esther 11.05.2022 21:53

Где вы назначаете содержимое переменным SERVICE_NAME и ENV?

Cyrus 11.05.2022 22:07

@JamesBrown Я добавил образцы данных @Esther, что-то вроде этого? ``` match = "false", если [[ $servicename = $SERVICE_NAME ]]; тогда если [[ $ENV = "sb" ]]; затем ID = "$key1" match = "true" fi elif [[ $match = "true" ]]; then echo "совпадение найдено" else echo "совпадение не найдено" fi ``` Пробовал, но не работает. Я неправильно устанавливаю флаг, возможно, @Cyrus находится вне цикла while. Проблема только с циклом if else, поэтому у меня есть только это.

DevOps_Engg 12.05.2022 00:08

Я бы написал поиск $input_file в awk и просто заставил бы awk напечатать значение $4, $5 или $6 при совпадении (или "not found" в правиле END) и присвоить результат переменной ID через Подстановка команд, а затем просто проверить, если $ID = "not found" как проверка в вашем скрипте. Не требуется петля.

David C. Rankin 12.05.2022 07:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте переменную, которая отслеживает, было ли найдено совпадение, и отображайте сообщение только в конце.

Как это:

#!/bin/bash

SERVICE_NAME = "blablabla"
ENV = "blablabla"
input_file = "input.txt"

match_found = "no"

while IFS=, read -r path servicename app text1 text2 text3
do
    text1 = "$key1"
    text2 = "$key2"
    text3 = "$key3"

    if [[ "$servicename" == "$SERVICE_NAME" ]]
    then
        match_found = "yes"
        if [[ "$ENV" == "sb" ]]
        then
            ID = "$key1"
        elif [[ "$ENV" == "lb" ]]
        then
            ID = "$key2"
        elif [[ "$ENV" == "dev" ]]
        then
            ID = "$key3"
        fi
    fi
done < "$input_file"

if [[ "$match_found" == "no" ]]
then
    printf "No match found\n"
fi

Еще пара модификаций:

  • используется == в условиях if для проверки совпадения текста
  • все переменные используются в двойных кавычках
  • Мне пришлось установить пару глобальных переменных в некоторые фиктивные значения, чтобы проверить мой ответ. Когда вы задаете вопрос, вы должны предоставить полный минимальный образец.

На самом деле вам нужно переместить match_found = "yes" внутри каждого из блоков if и elif, потому что у вас может быть "$servicename" == "$SERVICE_NAME", а затем нет совпадения $ENV. В этом случае установка только "$servicename" == "$SERVICE_NAME" даст ложное срабатывание.

David C. Rankin 12.05.2022 07:40

Нет, в коде ОП сообщение печатается только если servicename != SERVICE_NAME. Я не видел, чтобы в вопросе упоминалось это требование, но это могло быть недоразумением с моей стороны.

Nic3500 12.05.2022 12:00

Спасибо за предложение! == обязательно

DevOps_Engg 12.05.2022 18:00

Другие вопросы по теме