Linux Bash文件存在检测脚本异常求助:无法识别已存在文件
问题:Bash脚本无法检测已存在文件,但单独执行检测命令正常
环境与文件信息
- 脚本所在及执行目录:
home/jlia/scripts - 文件所在目录:
home/jlia/data,包含以下文件:jane_contact_07292018.csvjane_profile_07272018.doclist.txt
list.txt内容:
001 jane /data/jane_profile_07272018.doc 002 kwood /data/kwood_profile_04022017.doc 003 pchow /data/pcwow_profile_11042019.doc 004 janez /data/janez_ptofile_11042019.doc 005 jane /data/jane_pic_07282018.jpg 006 kwood /data/kwood_pic_04032017.jpg 007 pchow /data/pcwow_pic_05162019.jpg 008 jane /data/jane_contact_07292018.csv 009 kwood /data/kwood_contact_04042017.csv 010 pchow /data/pchow_contact_05172019.csv
编写的脚本内容
#!/bin/env bash archivos=$(grep "/jane_" ../data/list.txt | cut -d' ' -f 3); for file2 in $archivos; do if [ -e "..${file2}" ];then echo "exist ..${file2}"; else echo "not existe ..${file2}"; fi done
执行结果
not existe ../data/jane_profile_07272018.doc not existe ../data/jane_pic_07282018.jpg not existe ../data/jane_contact_07292018.csv
问题核心
脚本提取文件路径后检测存在性全失败,但单独执行[ -e "../data/jane_profile_07272018.doc" ]这类命令能正常识别文件存在。
原因分析
问题出在cut -d' ' -f 3这一步:list.txt里的字段分隔符是多个空格或制表符,而非单个空格。用-d' '指定单个空格作为分隔符时,cut会把连续空格当成多个分隔符,导致提取的file2变量开头带有多余的空格。
当脚本拼接成"..${file2}"时,实际路径前会多出空格(比如 ../data/jane_profile_07272018.doc),自然找不到文件;而手动执行时输入的是无多余空格的正确路径,所以能检测到。
解决办法
方法1:用awk提取字段(推荐)
awk默认会把任意数量的空白字符(空格、制表符)当成分隔符,替换原cut命令:
archivos=$(grep "/jane_" ../data/list.txt | awk '{print $3}')
方法2:清理变量中的多余空格
在使用file2前,去掉变量前后的空白字符:
file2_trimmed=$(echo "$file2" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') if [ -e "..${file2_trimmed}" ];then
方法3:改用while循环逐行处理(更安全的写法)
避免将所有结果存入变量再遍历,直接逐行读取并处理:
#!/bin/env bash grep "/jane_" ../data/list.txt | awk '{print $3}' | while read -r file2; do full_path="../${file2#/}" # 去掉路径开头的/,再拼接上级目录 if [ -e "$full_path" ];then echo "exist $full_path" else echo "not existe $full_path" fi done
内容的提问来源于stack exchange,提问作者Jose Luis Inzunza
相关产品推荐
相关产品推荐

