如何在Bash脚本中逐行打印Git Log?现有脚本输出异常
解决Bash脚本中Git Log输出不换行的问题
你的脚本存在几个关键问题,导致Git Log输出全部挤在一行,以下是修正方案和问题说明:
问题分析
- 变量引用未加双引号:
echo $x没有用双引号包裹$x,Bash会自动将所有空白字符(包括换行)替换成单个空格,原本多行的Git Log输出因此变成一行。 - 数组赋值与遍历错误:
IFS=$'\n' lines=( $(echo $x) )的赋值方式会触发Bash的分词和文件名扩展,可能破坏原内容;且for line in lines是循环字符串"lines",并非数组中的实际元素。
修正方案
方案一:直接遍历Git Log输出(推荐)
无需将结果存入变量,直接通过管道读取每一行,简单可靠:
#!/bin/bash git log --oneline --no-merges -n 5 | while read -r line; do echo "$line" done
如果只是需要逐行打印,甚至可以直接执行git log --oneline --no-merges -n 5,它本身就会逐行输出,无需额外处理。
方案二:用数组存储并正确遍历
如果需要将结果保存到数组后续处理,推荐用mapfile(Bash 4.0+支持)直接读取:
#!/bin/bash # 将Git Log输出逐行存入数组lines mapfile -t lines < <(git log --oneline --no-merges -n 5) # 遍历数组每一个元素 for line in "${lines[@]}"; do echo "$line" done
方案三:修正你原有的脚本
若要保留原脚本结构,修改如下:
#!/bin/bash # 加双引号保留换行符 x="$(git log --oneline --no-merges -n 5)" echo "$x" # 正确将内容分割为数组 IFS=$'\n' read -r -d '' -a lines <<< "$x" # 遍历数组元素 for line in "${lines[@]}"; do echo "$line" done
内容的提问来源于stack exchange,提问作者lucky1928
相关产品推荐
相关产品推荐

