从文本文件提取ID构建curl请求字符串的Bash脚本问题
问题解决:Bash脚本输出异常的原因与修复
问题根源
你的输出异常是因为numbers.txt是Windows格式的文本文件,每行末尾带有回车符(\r)。当脚本读取ID时,$ids变量会包含这个回车符,执行echo "hi/$ids/oo"时,\r会让光标跳转到行首,导致/oo覆盖了前面的hi/,从而出现/ooXXX的错误输出。最后一行正常是因为文件末尾可能没有多余的回车符。
修复方案
方案1:转换文件为Unix格式
使用dos2unix工具将文件转换为Unix风格(移除行尾的\r):
dos2unix numbers.txt
转换后直接运行你的原脚本即可得到正确输出。
方案2:在脚本中处理回车符
改用更安全的while read循环读取文件,同时移除ID中的回车符:
#!/bin/bash while IFS= read -r ids do # 移除变量中的回车符 ids=${ids//$'\r'/} echo "hi/$ids/oo" done < numbers.txt echo "ALL DONE"
while read相比for循环更适合处理文本行,能避免文件名含空格等特殊情况的问题。
方案3:用sed直接生成目标字符串
无需写循环,直接用sed命令处理文件内容:
sed 's/^/hi\//; s/$/\/oo/' numbers.txt | sed 's/\r$//'
第一个sed为每行添加前缀hi/和后缀/oo,第二个sed移除行尾的回车符。
内容的提问来源于stack exchange,提问作者fuwa07
相关产品推荐
相关产品推荐

