Bash读取输入文件带\r回车符导致cd报错如何解决?
Bash读取Windows格式文本行末尾携带\r的解决方案
报错根因:
project-list.txt为Windows格式文本文件,换行符为\r\n(CRLF),而Bash默认适配Unix格式的\n(LF)换行符,因此读取行内容时会将末尾的\r保留,最终导致拼接后的路径非法。
可用解决方法
- 方法1:读取内容时实时移除回车符
修改mapfile读取逻辑,通过tr提前过滤所有\r字符:
也可以在使用变量时单独处理后缀:mapfile -t arr < <(tr -d '\r' < project-list.txt)for i in "${arr[@]}"; do # 移除变量末尾的\r字符 i=${i%$'\r'} cd "$parent_folder/$i" done - 方法2:直接转换源文件为Unix格式
一次修改永久生效,无需调整脚本逻辑:- 若系统安装有
dos2unix工具,直接执行转换命令:dos2unix project-list.txt - 无
dos2unix时可通过sed替换行尾回车符:sed -i 's/\r$//' project-list.txt
- 若系统安装有
- 方法3:调整读取逻辑适配CRLF换行
自定义行分隔符,读取时自动过滤末尾\r:arr=() while IFS=$'\n\r' read -r line || [[ -n $line ]]; do arr+=("$line") done < project-list.txt
内容的提问来源于stack exchange,提问作者kittu
相关产品推荐
相关产品推荐

