在 shell 脚本中迭代输入文件中的所有条目后仅打印一次未找到匹配项
print no match found only once after iterating all entires from input file in shell script
我知道有办法做到这一点,但我现在好像想不起来了。
我有一个小的 shell 脚本,它有一个简单的 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
使用一个变量来跟踪是否找到匹配项,并仅在结束时显示消息。
像这样:
#!/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 条件中使用
==
来检查文本是否匹配
- 所有变量使用双引号
- 我不得不将几个全局变量设置为一些虚假值来测试我的答案。当你提出问题时,你应该提供一个完整的最小样本。
我知道有办法做到这一点,但我现在好像想不起来了。 我有一个小的 shell 脚本,它有一个简单的 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
使用一个变量来跟踪是否找到匹配项,并仅在结束时显示消息。
像这样:
#!/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 条件中使用
==
来检查文本是否匹配 - 所有变量使用双引号
- 我不得不将几个全局变量设置为一些虚假值来测试我的答案。当你提出问题时,你应该提供一个完整的最小样本。