如何在Bash中根据脚本变量动态获取可执行路径 避免大量if判断
解决方案
以下是两种简洁的实现方式,可替代冗长的if-elif分支:
方法1:使用Bash关联数组(推荐,Bash 4.0+版本支持)
这是最贴近映射需求的实现,后续新增对应关系仅需添加一行键值配置,无需修改执行逻辑:
run() { # 声明关联数组,建立cur_num到可执行文件的一一映射 declare -A exec_map=( ["0"]="$HOME/pathDirName0/execFile0" ["1"]="$HOME/pathDirName1/execFile1" ["2"]="$HOME/pathDirName2/execFile2" ["3"]="$HOME/pathDirName3/execFile3" ["4"]="$HOME/pathDirName4/execFile4" # 后续新增仅需在此添加配置即可,示例:["5"]="$HOME/xxx/xxx" ) # 校验当前cur_num存在对应映射时执行程序 if [[ -v exec_map[$cur_num] ]]; then ${exec_map[$cur_num]} fi }
注:这里将路径中的
~替换为了$HOME避免路径展开问题,不需要额外使用eval,安全性更高。
方法2:兼容旧版Bash的case实现
如果运行环境的Bash版本低于4.0不支持关联数组,可以用case语句简化分支结构,可读性远高于多层if-elif:
run() { case "$cur_num" in "0") ~/pathDirName0/execFile0 ;; "1") ~/pathDirName1/execFile1 ;; "2") ~/pathDirName2/execFile2 ;; "3") ~/pathDirName3/execFile3 ;; "4") ~/pathDirName4/execFile4 ;; # 后续新增分支仅需在此添加对应规则即可 esac }
内容的提问来源于stack exchange,提问作者rustyBucketBay
相关产品推荐
相关产品推荐

