KSH脚本无法解析属性文件中的$USER变量,求解决方法
解决KSH脚本中属性文件变量无法解析的问题
我太懂你遇到的这个坑了——在KSH里读属性文件时,内嵌的环境变量(比如$USER)死活不解析,原脚本里的eval用法没踩对点子。咱们一步步捋清楚问题,再给你修正后的方案。
原脚本的问题所在
你原来的代码里,echo eval "$record_line"这一步是把eval当成字符串的一部分输出了,相当于你只是打印了eval "table1_prop=$USER.table1;dir1;dir2"这句话,根本没让shell真正执行eval来解析$USER变量。这就导致后面的cut、sed处理的还是带$USER的原始字符串,自然得不到想要的结果。
修正后的脚本实现
核心思路是:先提取属性行中等号右侧的内容,单独用eval解析变量替换,再分割成数组。这里给你调整后的代码:
while read record_line; do # 过滤空行和仅含空格的行(用[[ ]]在KSH里更稳定) if [[ -n "$record_line" && "$record_line" != " " ]]; then # 提取等号右侧的部分(比如$USER.table1;dir1;dir2) right_side=$(echo "$record_line" | cut -d '=' -f 2) # 用eval解析变量,把$USER替换成实际用户名 resolved_content=$(eval echo "$right_side") # 按分号分割为数组,用tr比sed更简洁 record_array=($(echo "$resolved_content" | tr ';' '\n')) # 可选:测试输出数组内容,验证结果 echo "解析后的数组元素:" for item in "${record_array[@]}"; do echo " - $item" done fi done < prop
关键步骤解释
- 提取右侧内容:用
cut -d '=' -f 2把属性行拆分成左右两部分,只保留等号右边的内容。 - eval解析变量:
eval echo "$right_side"会让shell先解析$USER这类变量,把它替换成当前用户的实际值(比如你的用户名),再输出替换后的字符串。 - 分割成数组:用
tr ';' '\n'把分号换成换行符,再通过命令替换$(...)把每行内容作为数组元素。
这样运行脚本后,record_array里的第一个元素就会是你的用户名.table1,而不是带着$USER的原始字符串了。
内容的提问来源于stack exchange,提问作者Aavik
相关产品推荐
相关产品推荐

