Bash读取CSV时变量值在条件判断中失效问题求助
问题分析与解决方案
1. IF条件判断失效的原因与修复
你的CSV中每个逗号后都带有空格(比如, true),当用IFS=,读取时,column4变量会包含前导空格(比如第二行的column4实际是 123,而非123),导致[ "$column4" = "123" ]判断始终不成立。
有两种修复方式:
方式一:读取后清理变量空格
在处理逻辑中去除column4的前后空格,可用纯bash参数替换(高效无额外进程):while IFS=, read -r lineNo column1 column2 column3 column4 do # 去除前后空格 column4_trimmed="${column4## }" column4_trimmed="${column4_trimmed%% }" echo "$column4_trimmed" if [ "$column4_trimmed" = "123" ]; then echo "condition is true" else echo "condition is false" fi done < <(tail -n +2 "$setupFileLocation")方式二:预处理CSV格式
在读取前用sed替换掉逗号后的空格,从根源解决字段带空格的问题:while IFS=, read -r lineNo column1 column2 column3 column4 do echo "$column4" if [ "$column4" = "123" ]; then echo "condition is true" else echo "condition is false" fi done < <(tail -n +2 "$setupFileLocation" | sed 's/, /,/g')
2. CSV末尾必须加0的问题修复
该问题是因为如果CSV最后一行没有换行符,read命令读取最后一行时会返回非零退出状态,导致循环提前终止(无法处理最后一行)。
修复方法:调整循环条件,即使read返回非零,只要读取到的内容不为空就继续执行:
while IFS=, read -r lineNo column1 column2 column3 column4 || [ -n "$lineNo" ] do # 先处理空格问题(二选一即可) column4_trimmed="${column4## }" column4_trimmed="${column4_trimmed%% }" echo "$column4_trimmed" if [ "$column4_trimmed" = "123" ]; then echo "condition is true" else echo "condition is false" fi done < <(tail -n +2 "$setupFileLocation")
也可以用sed强制给CSV末尾添加换行符,保证read能正确识别所有行:
done < <(tail -n +2 "$setupFileLocation" | sed -e '$a\\')
内容的提问来源于stack exchange,提问作者dbradish-gmail
相关产品推荐
相关产品推荐

