我有一个字符串,它是我无法控制的某些操作的结果。当我使用 打印这个变量时echo
,我得到:
echo $myvar
hello
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时
if [ $myvar = "hello" ]; then
echo they are equal
else
echo they are not equal
fi
Run Code Online (Sandbox Code Playgroud)
我总是明白他们是不平等的。我怀疑这是因为一个newline
角色。
字符串的行为也很奇怪。当我做:
newVAR="this is my var twice: "$myvar$myvar
echo $newVAR
Run Code Online (Sandbox Code Playgroud)
我得到:
hellois my var twice: hello
Run Code Online (Sandbox Code Playgroud)
我如何检查这是否确实是由 a 引起的newline
,如果是,则将其删除?
Pet*_*r.O 10
问题是您有一个嵌入式回车符 (CR, \r
)。这会导致终端文本插入点回到它正在打印的行的开头。这就是为什么您会在$newVAR
示例中的行首看到“hello”的原因-sed -n l
显示不可打印字符(和行尾)的可读视图。
var=ab$'\r'c ; echo "$var"; printf %s "$var" | sed -n l
# output:
cb
ab\rc$
Run Code Online (Sandbox Code Playgroud)
您可以使用简单的 bash 条件检查来测试它:
[[ $var == *$'\r'* ]] && echo yes || echo no
# output:
yes
Run Code Online (Sandbox Code Playgroud)
您可以通过测试\r
(s) 并通过以下方式将其删除,从而在一个步骤中组合测试和修复:
fix="${var//$'\r'/}"; echo "$var"; echo "$fix"
# output:
cb
abc
Run Code Online (Sandbox Code Playgroud)
该修复程序使用Shell Parameter Expansion。上面所用的特定形式是用于替换基于你proovided图案子:${parameter/pattern/string}
< -这仅替换第一个找到的图案与串在名为*参数变量。要替换所有模式,您只需要将第一个更改/
为//
.
你可以表示\r
为$'\r'
在bash:
if [ "$myvar" = "hello"$'\r' ]; then
echo they are equal
else
echo they are not equal
fi
Run Code Online (Sandbox Code Playgroud)
剁最后\r
在myvar
:
if [ "${myvar%$'\r'*}" = "hello" ]; then
echo they are equal
else
echo they are not equal
fi
Run Code Online (Sandbox Code Playgroud)