You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash循环逐行读文件时sqlcmd路径变量异常问题解决

解决Bash while循环读取文件后sqlcmd无法识别路径的问题

问题根源

你的SqlFiles.txt文件采用了Windows格式的换行符(CRLF,即\r\n),Bash读取时会将每行末尾的回车符(\r)保留在$line变量中。拼接路径后,这个隐藏的回车符会导致sqlcmd识别到无效文件名——报错信息里的乱码输出(': Invalid filename.base_Files/MyScript.sql)就是回车符让光标跳回行首、覆盖部分内容导致的。

解决方案

方案1:将文件转换为Unix格式(推荐)

直接把SqlFiles.txt的换行符改成Unix标准的LF(\n),可用以下工具:

  • 使用dos2unix工具(多数Linux发行版自带):
    dos2unix SqlFiles.txt
    
  • 若没有dos2unix,用sed命令批量替换回车符:
    sed -i 's/\r$//' SqlFiles.txt
    

方案2:在读取时自动去除回车符

修改Bash脚本,在使用$line变量前手动移除末尾的回车符:

baseFileDir=./Base_Database_Files/
if [ -f "./SqlFiles.txt" ]; then
    while IFS= read -r line  || [[ -n "$line" ]]
    do  
        # 移除行末尾的Windows回车符
        line=${line%$'\r'}
        sqlFilePath=${baseFileDir}$line
        echo "Executing: $sqlFilePath"
        sqlcmd -S $server,$port -U $user -P $password -d $database -I -i "$sqlFilePath"  < /dev/null
    done <./SqlFiles.txt
fi

验证方法

若不确定是否为换行符问题,可打印$line的十六进制编码,查看是否包含回车符(十六进制为0d):

echo -n "$line" | xxd

内容的提问来源于stack exchange,提问作者Farrukh Waheed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:35:16