source命令无法识别已存在文件,Shell脚本执行异常求助
问题描述
现有文件结构及脚本执行异常情况如下:
items文件内容:
itemA itemB
itemA.settings文件内容:
export title="Title itemA"
itemB.settings文件内容:
export title="Title itemB"
执行 configure-all-items.sh 脚本后出现以下问题:
- 生成含特殊字符的文件
Title itemA.txt,文件内容为空标题:
Item has title:
Title itemB.txt内容正常:
Item has title: Title itemB
- 执行时报错:
line xx: ./../../../itemA: No such file or directory
错误分析与修复方案
1. configure-all-items.sh 脚本错误修复
原脚本存在变量赋值、循环语法及特殊字符处理问题:
- 变量赋值多写了
$:$itemListDIR="../path"需改为itemListDIR="../path" - 循环语法错误:
for(item in itemList)不符合Bash语法,改用while read循环可避免换行/隐藏字符问题 - 未处理文件中可能的空行或特殊换行符
修复后的脚本:
#!/bin/bash itemListDIR="../path" # 用while read循环读取文件,跳过空行并保留原格式 while IFS= read -r item do [[ -z "$item" ]] && continue echo "Configuring item: $item" # 确保调用prepare-item.sh的路径正确,这里假设同目录 ./prepare-item.sh "$item" done < "$itemListDIR/items"
2. prepare-item.sh 脚本错误修复
原脚本存在变量赋值、路径解析及特殊字符处理问题:
- 变量赋值多写了
$:$item="$1"需改为item="$1" source命令可能因工作目录问题找不到settings文件,需用绝对路径定位- 未处理
item中可能的隐藏特殊字符(如Windows换行符\r),导致解析异常
修复后的脚本:
#!/bin/bash item="$1" # 移除item中的隐藏特殊字符(如Windows换行符\r) item=$(echo "$item" | tr -d '\r') # 获取当前脚本所在目录,确保能正确找到settings文件 script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) source "$script_dir/$item.settings" # 校验title变量是否有效 if [[ -z "$title" ]]; then echo "Error: title not set for item $item" exit 1 fi # 生成目标文件 echo "Item has title: $title" > "$title.txt"
3. 特殊字符问题说明
Title itemA.txt 中的特殊字符,大概率是items文件中itemA行末尾带有Windows风格的换行符\r(回车符),导致变量item被解析为itemA\r,进而干扰source命令执行和title变量赋值。修复脚本中添加的tr -d '\r'可移除这类隐藏字符。
内容的提问来源于stack exchange,提问作者Rando Shtishi
相关产品推荐
相关产品推荐

