Bash while read循环变量解析异常及文件检测失效问题
问题
我有一个仅包含文本行的csv文件test_list(实际文件名为test_list.csv),内容为test_name_1、test_name_2。需要检测每个test_name对应的./$test_name/$test_name.txt文件是否存在,不存在则输出提示。
在MINGW64 shell中执行while read循环代码后,echo $test_name输出正常,但路径解析出现错乱,明明实际存在的文件却被提示找不到。单独在shell中声明test_name="test_name_1"测试循环内的代码,echo输出和条件判断均正常,推测问题出在while read循环对$test_name的解析逻辑上。
修复方案
经排查,问题根源是csv文件中存在不可见的\r字符(可通过od -c "$test_list"命令检测),这导致文件存在性检测-f失效,同时引发路径解析错乱。可通过dos2unix $test_list命令修复文件格式。
另外,为避免文件最后一行未换行时读取失败,需统一while read循环中的变量名,并添加兜底判断。修复后的可用代码如下:
dos2unix $test_list while read -r line || [ -n "$line" ]; do echo $line if [ ! -f "./$line/$line.tst" ]; then echo "$(pwd)/$line/$line.tst not found! Check for any typo in the file name." fi done < $test_list
内容的提问来源于stack exchange,提问作者jeannej
相关产品推荐
相关产品推荐

