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
相关产品推荐
相关产品推荐

