Bash如何读取双列文本变量逐行拼接生成指定格式路径
问题解决:Bash逐行读取两列文件拼接生成路径
你写的双重循环会遍历两个变量的所有排列组合,无法实现一行的两个字段一一对应,所以不符合需求。
方案1:逐行读取(最推荐)
逻辑简单,兼容大部分场景,不需要额外处理数组长度匹配问题:
# 先输出模板路径 echo "/home/user/var1/var2/" # 逐行读取file.txt的两列内容 while read -r var1 var2; do echo "/home/user/${var1}/${var2}/" done < file.txt
说明:read -r var1 var2 会自动把每一行按空白分割,第一个字段赋值给var1,第二个赋值给var2,刚好匹配你的file.txt格式,-r 参数用来避免转义字符被特殊处理,建议常规场景都加上。
方案2:数组按索引遍历(沿用你原思路的修改版)
如果你想保留数组读取的写法,可以统一按索引遍历两个数组,实现逐行对应:
# 数组赋值等号两边不能有空格 var1=($(cut -f1 file.txt)) var2=($(cut -f2 file.txt)) # 先输出模板路径 echo "/home/user/var1/var2/" # 按索引遍历,确保两列字段一一对应 for ((idx=0; idx<${#var1[@]}; idx++)); do echo "/home/user/${var1[idx]}/${var2[idx]}/" done
注意:该方案需要保证file.txt每行都有两列内容,两个数组长度一致,否则会出现错位。
原代码的其他语法问题修正
- 数组赋值时等号两边不能有空格,你写的
var1 = (cut -f1 file.txt)属于语法错误,正确写法是var1=($(cut -f1 file.txt)) - 输出路径时漏掉了根目录的前缀
/,你写的echo home/user/$i/$j/生成的是相对路径,要改成echo /home/user/$i/$j/才能得到你需要的绝对路径
内容的提问来源于stack exchange,提问作者sciencenmagic
相关产品推荐
相关产品推荐

