如何在循环结束时回显?

how to echo at the end of a loop?

问题:

我有一个在 while 循环中定义的变量。我构建了这个变量,最后我想回应它。像这样:

function removeCarriageReturn()
{
  word=""

  echo "" | while IFS= read -r -n1 char ; do
    if [ "${char}" != $"\r" ] ; then
      word="${word}${char}"
    fi
  done && echo ${word}
}

我不知道该怎么做。如果我在之后做 echo,word 是空的,因为 while 就像一个 sub shell.

您在使用 bash 吗?根据 function 声明和 $'\r',您似乎是。如果是这样,有一个非常简单的解决方案:

function removeCarriageReturn()
{
  local word

  while IFS= read -r -n1 char ; do
    if [ "${char}" != $"\r" ] ; then
      word="${word}${char}"
    fi
  done <<<"" && echo "$word"
}

我在这里使用 bash 字符串 <<< 将值传递给循环,而不是使用带有管道的 echo。正是管道的使用导致您的循环在子外壳中 运行。

顺便说一句,在变量周围使用大括号(例如 ${word})在某些地方可能很有用,但实际上并不能保护您免受单词拆分或 glob 扩展的影响。最好引用您的变量(即改用 "$word")。即使在 echo ${word} 等看似无害的情况下,如果单词中有 *,您也可能会被识别出来,例如

更好的是,使用 printf '%s\n' "$word",原因在上面 中提到。

正如 Charles 还提到的,您应该使用 localdeclare,以便在本地范围内声明 word