Я знаю, что есть способ сделать это, но сейчас я не могу вспомнить. У меня есть небольшой сценарий оболочки с простым циклом 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
то, что вы хотите сделать, это создать флаг, который содержит «независимо от того, нашел ли он что-то» вне цикла, инициализированного значением «false». Затем, после того, как вы найдете то, что действительно хотите напечатать, переключите его на «true». После того, как вы закончите цикл, проверьте, является ли флаг «ложным», и если он печатает «не найдено» в конце
Где вы назначаете содержимое переменным SERVICE_NAME и ENV?
@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, поэтому у меня есть только это.
Я бы написал поиск $input_file в awk и просто заставил бы awk напечатать значение $4, $5 или $6 при совпадении (или "not found" в правиле END) и присвоить результат переменной ID через Подстановка команд, а затем просто проверить, если $ID = "not found" как проверка в вашем скрипте. Не требуется петля.





Используйте переменную, которая отслеживает, было ли найдено совпадение, и отображайте сообщение только в конце.
Как это:
#!/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" даст ложное срабатывание.
Нет, в коде ОП сообщение печатается только если servicename != SERVICE_NAME. Я не видел, чтобы в вопросе упоминалось это требование, но это могло быть недоразумением с моей стороны.
Спасибо за предложение! == обязательно
Пожалуйста, опубликуйте некоторые примеры данных с соответствующим ожидаемым результатом. Не публикуйте их в виде комментариев, изображений, таблиц или ссылок на сторонние сервисы, а используйте текст и включайте их в исходный вопрос. Спасибо.