如何用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
关键步骤说明
- 判断对象类型:通过
case语句识别当前处理的区块是视图还是表,确定objType; - 处理每行记录:逐行读取区块内容,先移除行首空白字符,避免分割出错;
- 字符串分割:利用
IFS环境变量,先按:分割出完整对象标识和文件路径,再按.分割出schema和对象名; - 格式化输出:按示例要求输出各个变量。
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

