KSH脚本字符串转秒函数异常:配置文件取值解析失败
问题原因及解决方案
核心原因:配置文件存在隐藏的回车符(\r)
你的value变量视觉上显示为200s,但实际可能带有Windows格式的换行符——回车符(\r)。这类字符在终端输出时不会直接显现(echo "|${value}|"执行时,\r会让光标回到行首,覆盖左侧的|,导致你看到的结果看似正常),但会干扰函数内的字符匹配逻辑:
- 直接传
200s时,参数是纯Unix格式字符串,函数能正确拆分数字和时间单位; - 传递带
\r的200s\r时,函数的匹配规则(比如提取末尾字母的正则)会因为\r的存在无法识别单位字符,最终导致numeral拿到整个带隐藏字符的字符串(视觉上显示为200s)、timeselector为空。
解决方法
方法1:提取值时清理控制字符
在获取value的命令后追加tr命令,删除回车符及其他不可见控制字符:
value=$(echo $line | cut -d '=' -f 2 | tr -d '\r[:cntrl:]')
方法2:在函数内部处理输入
修改convert_string_to_seconds函数,先对输入做清理:
convert_string_to_seconds() { local input=$(echo "$1" | tr -d '\r[:cntrl:]') # 保留原解析逻辑 numeral=$(echo "$input" | sed 's/[^0-9]//g') timeselector=$(echo "$input" | sed 's/[0-9]//g') # ... 后续计算代码 }
方法3:转换配置文件格式
如果配置文件是Windows环境编辑的,用dos2unix工具将其转为Unix格式:
dos2unix your_config_file.conf
内容的提问来源于stack exchange,提问作者Mustang GX
相关产品推荐
相关产品推荐

