使用IFS=read读取变量作为路径时ln链接创建失败的解决求助
问题解决方案
1. 先修复循环的判断逻辑
你脚本里的|| [ -n "$p" ]是明显错误——$p是未定义的变量,应该改成$bandB,这样才能保证文件最后一行即使没有换行符也能被正确读取:
while IFS= read -r bandB || [ -n "$bandB" ]
2. 给变量加双引号包裹
所有变量引用都用双引号括起来,避免特殊字符、空格导致的解析错误,不管是printf还是ln命令都要做:
printf '%s\n' "$bandA" printf '%s\n' "$bandB" ln -sfn "/bst.$bandB.cfg" "/bst.cfg"
3. 处理文件里的隐藏回车符
大概率你的LIST.txt是Windows格式的(带\r回车符),读取到的$bandB会暗藏这个符号,导致实际路径变成/bst.B01\r.cfg,自然找不到文件。
两种解决方式:
- 先转文件格式:
dos2unix LIST.txt - 或者直接在脚本里处理变量:
bandB=$(echo "$bandB" | tr -d '\r') # 去掉可能的回车符
最终修正后的完整脚本
bandA="B01" while IFS= read -r bandB || [ -n "$bandB" ] do # 移除可能的Windows回车符 bandB=$(echo "$bandB" | tr -d '\r') printf '%s\n' "$bandA" printf '%s\n' "$bandB" ln -sfn "/bst.$bandB.cfg" "/bst.cfg" done < LIST.txt
排查小技巧
如果还是有问题,可以在ln命令前加个echo,打印出实际执行的命令,就能看到路径是否正确:
echo "实际执行:ln -sfn \"/bst.$bandB.cfg\" \"/bst.cfg\"" ln -sfn "/bst.$bandB.cfg" "/bst.cfg"
内容的提问来源于stack exchange,提问作者kaefer
相关产品推荐
相关产品推荐

