Shell脚本模块编号分配问题:实现映射、case调用及指定格式打印
Bash模块编号分配解决方案
修正后的完整脚本实现
# 存储模块列表的全局数组 declare -a module_list # 加载模块到数组的函数 load_modules() { # 清空数组 module_list=() # 遍历modules目录下的文件/目录,存入数组(避免ls的空格问题,用glob更安全) for mod in ./modules/*; do # 只取文件名,去掉路径 mod_name=$(basename "$mod") module_list+=("$mod_name") done } # 单独的模块列表打印函数 print_modules() { local count=0 local total=${#module_list[@]} while [ $count -lt $total ]; do # 处理第一列 local idx1=$((count + 1)) echo -n "[${idx1}] ${module_list[$count]}" count=$((count + 1)) # 如果还有下一个,处理第二列 if [ $count -lt $total ]; then local idx2=$((count + 1)) echo -n " [${idx2}] ${module_list[$count]}" count=$((count + 1)) fi # 换行 echo done } # 生成对应编号的模块调用逻辑(模拟case分支的实际执行) run_module() { local choice=$1 local idx=$((choice - 1)) if [ $idx -ge 0 ] && [ $idx -lt ${#module_list[@]} ]; then # 这里替换为实际模块的执行逻辑,比如调用对应函数或执行脚本 echo "Executing ${module_list[$idx]}..." # 示例:若模块是可执行脚本,可写为 ./modules/${module_list[$idx]} else echo "Invalid choice: $choice" fi } # 主逻辑示例 main() { load_modules echo "Available modules:" print_modules # 模拟用户输入选择 read -p "Enter your choice: " choice # 对应要求的case结构(静态分支更安全,数量多可按需扩展) case $choice in 1) run_module 1 ;; 2) run_module 2 ;; 3) run_module 3 ;; 4) run_module 4 ;; *) echo "Invalid choice" ;; esac } # 执行主逻辑 main
关键修正与说明
- 模块存储优化:用
declare -a声明数组存储模块列表,改用glob遍历目录替代ls,避免空格文件名解析错误。 - 独立打印逻辑:
print_modules函数单独负责按双列格式输出编号与模块名,完全符合“模块名称不在循环内输出”的要求。 - 算术运算修正:bash中算术运算需用
$((...))语法,替换原脚本x=$(x+1)的错误写法,确保编号递增正常。 - case分支匹配:通过
run_module统一处理模块执行,case分支只需传递编号即可,后续模块增减时只需扩展case分支和数组内容,维护更方便。
原脚本错误修复点
- 原循环
for module in modules; do改为遍历数组或./modules/*,否则仅会循环字符串"modules"而非实际模块。 - 原编号递增语句
x=$(x+1)改为x=$((x+1)),符合bash算术运算规则。 - 将输出逻辑完全剥离到单独函数,满足格式要求。
内容的提问来源于stack exchange,提问作者nobody65534
相关产品推荐
相关产品推荐

