问题:
我有一个在while循环中定义的变量。我建立了这个变量,最后我想回应它。像这样:
function removeCarriageReturn()
{
word=""
echo "${1}" | while IFS= read -r -n1 char ; do
if [ "${char}" != $"\r" ] ; then
word="${word}${char}"
fi
done && echo ${word}
}
我不知道怎么做。如果我之后做回声,那么单词是空的,因为while就像一个子shell。
答案 0 :(得分:3)
function
,它看起来像你。如果是这样,那就有一个非常简单的解决方案:
$'\r'
这里我使用bash here string function removeCarriageReturn()
{
local word
while IFS= read -r -n1 char ; do
if [ "${char}" != $"\r" ] ; then
word="${word}${char}"
fi
done <<<"$1" && echo "$word"
}
将值传递给循环,而不是将<<<
与管道一起使用。使用导致循环在子shell中运行的管道。
顺便说一下,在变量周围使用大括号(例如echo
)在某些地方可能很有用,但实际上并不能保护你免受单词拆分或全局扩展。最好引用你的变量(即使用${word}
代替)。即使在"$word"
等看似良性的情况下,例如,如果单词中有echo ${word}
,您可能会被发现。
更好的是,使用*
,原因如上Charles' comment中提到的那样。
正如Charles所提到的,您应该使用printf '%s\n' "$word"
或local
,以便在本地范围内声明declare
。