如何在 while 循环中消除这个重复的 "git diff" 调用?

How can I eliminate this duplicated "git diff" call in a while loop?

如何优化此代码结构以避免重复代码 (git diff --ignore-space-at-eol -U0)?

while [ ! -z "$(git diff --ignore-space-at-eol -U0)" ]; do
  diff_text=$(git diff --ignore-space-at-eol -U0);
  echo $diff_text
done

在 PHP 中可以这样做:

while (! $diff_text = "git diff --ignore-space-at-eol -U0") {
  echo $diff_text;
}

我们需要代码,以便将 diff_text 变量减去 1 次。

使用带有中断条件的无限循环在中断循环的比较之前添加命令:

while true; do
   i=$(date)
   echo $i
   [[ "$i" =~ "9 " ]] && break
   sleep 1
done 

您可以在 while 条件块中插入多条指令:

while
  diff_text=$(git diff --ignore-space-at-eol -U0)
  [ -n "$diff_text" ]
do
  echo "$diff_text"
done

一个选项是使用设置 diff_text 变量的函数,如果它为空,returns 非零:

function set_diff_text
{
    diff_text=$(git diff --ignore-space-at-eol -U0)

    [[ -n $diff_text ]] && return 0 || return 1
}

while set_diff_text; do
    printf '%s\n' "$diff_text"
done

另一种使用函数的方法是:

function get_diff_text
{
    local difftxt
    difftxt=$(git diff --ignore-space-at-eol -U0)
    printf '%s\n' "$difftxt"

    [[ -n $difftxt ]] && return 0 || return 1
}

while diff_text=$(get_diff_text); do
    printf '%s\n' "$diff_text"
done
  • 请参阅对 Why is printf better than echo? 的公认且优秀的回答,以了解我为何使用 printf 而不是 echo 来打印 git diff 输出的原因。