传递变量与字符串求值:Shell脚本目录变量调用问题
解决方法:根据传入参数动态获取对应的目录变量
这问题很常见,用bash的间接引用特性就能轻松搞定,我给你一步步拆解实现步骤:
1. 整理变量定义文件
假设你的变量文件名叫dirs.conf,去掉多余的括号,用标准的bash变量赋值格式即可:
DIR_A="/home/user/docs" DIR_B="/home/user/downloads" DIR_C="/home/user/projects"
2. 编写目标脚本(示例命名为get_target_dir.sh)
脚本需要完成参数校验、加载变量文件、拼接目标变量名、安全取值这几个核心步骤:
#!/bin/bash # 先检查用户是否传入了有效参数 if [ $# -ne 1 ]; then echo "用法错误!正确格式:$0 <varname>" echo "示例:$0 A 会输出DIR_A对应的目录路径" exit 1 fi # 加载变量定义文件,注意路径要正确,若不在同目录请用绝对路径 source ./dirs.conf # 拼接出要获取的目标变量名:DIR_ + 传入的参数 target_var="DIR_$1" # 检查变量是否存在,避免输出空值或无意义内容 if [ -z "${!target_var}" ]; then echo "错误:找不到对应的变量 $target_var" exit 1 fi # 输出最终的目录路径 echo "${!target_var}"
3. 运行脚本的方式
完全符合你想要的执行格式:
sh get_target_dir.sh A
执行后会输出/home/user/docs;传入B则输出/home/user/downloads,以此类推。
一些实用注意事项
- 路径问题:如果
dirs.conf和脚本不在同一目录,source时务必写绝对路径(比如source /opt/configs/dirs.conf),否则脚本会找不到配置文件。 - 大小写敏感:bash变量名区分大小写,传入的参数要和你定义的
DIR_A后缀严格匹配(比如a和A会对应不同变量)。 - 安全提示:我用的
${!target_var}是bash的间接引用语法,比eval类写法更安全,能避免潜在的命令注入风险,优先推荐这种方式。
内容的提问来源于stack exchange,提问作者Suraj T
相关产品推荐
相关产品推荐

