如何在循环结束时回显?
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 还提到的,您应该使用 local
或 declare
,以便在本地范围内声明 word
。
问题:
我有一个在 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 还提到的,您应该使用 local
或 declare
,以便在本地范围内声明 word
。