shell 如果只有一个元素,while循环不工作

ego6inou  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(109)

我正在写一个脚本来创建一些更新日志。它查看自上一个标记以来的所有提交,并在每个提交消息前添加-

#!/bin/bash

tag_commits_reversed=$(git rev-list --tags --max-count=1)
tags=$(git describe --match "tag_prefix*" --abbrev=0 --tags $tag_commits_reversed)
commit_messages=$(git log $tags..@ --no-merges --pretty=format:"%s" -- . | while read line; do echo "- $line"; done)

echo $commit_messages

输出如下所示:
- commit_message_1 - commit_message_2 - commit_message_3
但是,如果自上一个标记以来只有一次提交,则| while read line; do echo "- $line"; done不会正确地将-前置到单个提交消息。
我期望- commit_message_1,但只得到一个空输出。
我错过了什么?

u59ebvdq

u59ebvdq1#

我想这个问题可以用这个例子来解释:

read < <(printf %s foo) && echo "$REPLY"
read < <(printf '%s\n' bar) && echo "$REPLY"

其输出:

bar

也就是说:如果输入没有以预期的结果结束(\n您的情况),那么read命令的计算结果为falsewhile read循环提前结束。
一个常见的解决方法是在while条件下检查变量的大小:

... | while read line || (( ${#line} )); do ...

相关问题