如何在bash脚本中遍历Python输出的含空格名称列表?
解决方案
问题根源
当前问题的核心是两层逻辑导致的字段拆分异常:
- Python直接输出的列表没有明确的名称边界,空格既会出现在单个名称内部,也会作为名称之间的分隔符
- Bash默认的内部字段分隔符(IFS)包含空格,会将所有空格识别为字段拆分标记,导致完整名称被拆分为单个单词
最优实现方案(推荐)
步骤1:修改Python输出逻辑,明确名称边界
调整Python脚本,让每个完整名称单独占一行输出,从源头避免空格歧义:
names = ["Raj Sonakshi", "Getendar", "Raghu Varan (Mr)"] # 逐行打印每个完整名称,明确分隔边界 for name in names: print(name)
步骤2:调整Bash读取逻辑,保留名称内空格
使用mapfile命令将Python逐行输出的内容完整读取到数组中,再遍历数组:
# -t 参数会自动去掉每行末尾的换行符 mapfile -t arr < <(python names.py) # 遍历数组时必须给变量加双引号,避免空格拆分 for i in "${arr[@]}"; do echo "$i" done
临时兼容方案(无需修改Python脚本)
如果无法调整Python脚本,可通过awk预匹配固定格式的名称拆分后再读取,仅适合固定名称列表的场景:
while IFS= read -r line; do arr+=("$line") done < <(python names.py | awk 'match($0, /(Raj Sonakshi|Getendar|Raghu Varan \(Mr\))/, res) {for(i in res) print res[i]}') for i in "${arr[@]}"; do echo "$i" done
内容的提问来源于stack exchange,提问作者jessy
相关产品推荐
相关产品推荐

