WSL Ubuntu 20.04运行URL响应码检测脚本报curl错误3如何解决
问题解决方法
报错根因
这个错误核心原因是Windows和Linux的行尾符差异:
- 你使用的CSV文件如果是在Windows环境下创建/编辑的,默认行尾为
CRLF(\r\n换行+回车双字符) - WSL Ubuntu的bash读取每行内容时,会把行尾的
\r回车符也读到$link变量里,导致curl识别URL时把非法的\r算入URL,触发格式错误
如果你的CSV是多列逗号分隔格式,还可能是未正确切分字段,把后续列的内容也拼到了URL里。
可行解决方案
任选一种操作即可:
方案1:转换CSV文件格式(一劳永逸)
先安装行尾转换工具:
sudo apt update && sudo apt install -y dos2unix
对目标CSV执行格式转换,将行尾改为WSL识别的LF格式:
dos2unix 你的CSV文件路径.csv
转换完成后再运行原脚本即可正常执行。
方案2:修改脚本兼容Windows格式CSV(无需修改原文件)
修改原脚本内容,自动过滤掉每行的\r字符,多列CSV场景也会自动切分取第一列URL,同时增加基础容错逻辑:
#!/usr/bin/env bash # 传入参数校验,避免参数缺失报错 if [[ $# -ne 2 ]]; then echo "使用方式:bash $0 <CSV文件路径> <目标响应码>" exit 1 fi while IFS=, read -r link _ || [[ -n "$link" ]]; do # 移除URL中的回车符 link=${link//$'\r'/} # 跳过空行 [[ -z "$link" ]] && continue # 如果CSV有表头,可取消注释下一行并替换为你的表头内容跳过第一行 # [[ $link == "URL表头" ]] && continue response=$(curl --connect-timeout 5 --output /dev/null --silent --write-out %{http_code} "$link") if [[ "$response" == "$2" ]]; then echo "$link" fi done < "$1"
调整后直接运行即可,额外加的超时、静默参数也能避免curl输出多余日志。
方案3:临时过滤行尾符
无需修改原文件和脚本,运行命令时临时处理输入:
tr -d '\r' < 你的CSV文件路径.csv | bash script.sh /dev/stdin 200
内容的提问来源于stack exchange,提问作者luknij
相关产品推荐
相关产品推荐

