You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Shell脚本遍历数组提取视图与表的各组件变量

问题描述

现有配置文件内容如下:

view:
  schema1.view1:/some-path/view1.sql
  schema2.view2:/some-path/view2.sql
tables:
  schema1.table1:/some-path/table1.sql
  schema2.table2:/some-path/table2.sql
end:

已通过以下Shell命令提取视图和表的区块数据并存入数组:

viewData=$(sed  '/view/,/tables/!d;/tables/q' $file|sed '$d')
tableData=$(sed  '/tables/,/end/!d;/end/q' $file|sed '$d')
dataArray=("$viewData" "$tableData")

需要遍历dataArray,将每个条目拆解为objType、schema、对应对象名(view/table)、fileLoc变量,并按示例格式输出。

解决方案

以下是纯Shell脚本实现的方案:

# 替换为你的配置文件路径
file="config.txt"

viewData=$(sed '/view/,/tables/!d;/tables/q' "$file" | sed '$d')
tableData=$(sed '/tables/,/end/!d;/end/q' "$file" | sed '$d')
dataArray=("$viewData" "$tableData")

# 遍历数组中的每个数据区块
for block in "${dataArray[@]}"; do
    # 判断当前区块的对象类型
    case "$block" in
        *"view"*) objType="view" ;;
        *"table"*) objType="table" ;;
    esac

    # 逐行处理区块内的每条记录
    while IFS= read -r line; do
        # 跳过空行
        [[ -z "$line" ]] && continue
        
        # 移除行首的空白字符
        line_trimmed=$(echo "$line" | sed 's/^[[:space:]]*//')
        
        # 分割为"schema.obj"和文件路径两部分
        IFS=':' read -r obj_qualified fileLoc <<< "$line_trimmed"
        
        # 分割schema和对象名
        IFS='.' read -r schema obj_name <<< "$obj_qualified"
        
        # 按要求格式输出变量
        echo "objType=$objType"
        echo "schema=$schema"
        echo "$objType=$obj_name"
        echo "fileLoc=$fileLoc"
    done <<< "$block"
done

关键步骤说明

  1. 判断对象类型:通过case语句识别当前处理的区块是视图还是表,确定objType;
  2. 处理每行记录:逐行读取区块内容,先移除行首空白字符,避免分割出错;
  3. 字符串分割:利用IFS环境变量,先按:分割出完整对象标识和文件路径,再按.分割出schema和对象名;
  4. 格式化输出:按示例要求输出各个变量。

内容的提问来源于stack exchange,提问作者Chuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:45:43