首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash编程(Cygwin):非法字符^M

Bash编程(Cygwin):非法字符^M
EN

Stack Overflow用户
提问于 2011-11-30 03:36:29
回答 7查看 11.7K关注 0票数 6

我对一个角色有意见。我认为这是一个dos和unix之间的转换问题。

我有一个变量,它是一个浮点值。当我使用echo命令打印它时,我得到:

代码语言:javascript
运行
复制
0.495959

但是当我尝试使用bc命令对该值进行操作时(我不确定如何编写bc命令)。

代码语言:javascript
运行
复制
echo $mean *1000 |bc

我得到了:

代码语言:javascript
运行
复制
(standard_in) 1 : illegal character: ^M

我已经在我的.sh文件上使用了dos2unix命令。我想这是因为我的变量有^M字符(没有用echo命令打印)

如何消除此错误?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-11-30 03:59:46

我手头上没有Cygwin,但是在常规的Bash中,您可以使用tr -d命令删除指定的字符,并且可以使用$'...'表示法在命令行参数中指定奇怪的字符(它类似于普通的单引号字符串,只是它支持类似C/Java/Perl/等的转义序列)。所以,这是:

代码语言:javascript
运行
复制
echo "$mean" * 1000 | tr -d $'\r' | bc

将在从echobc的过程中去掉回车。

您可能真的想要运行以下命令:

代码语言:javascript
运行
复制
mean=$(echo "$mean" | tr -d $'\r')

它将修改$mean,去掉其中的任何回车符,这样您就不必在后面使用它的命令中担心它了。

(不过,首先看看设置$mean的代码也是值得的。不管怎么说,$mean怎么会有一个回车呢?也许你可以解决这个问题。)

票数 12
EN

Stack Overflow用户

发布于 2011-11-30 22:25:25

这是可行的:

${mean/^M/}

可以通过键入Ctrl-V,然后键入Ctrl-M来获取^M。或者,或者:

${mean/$(printf "\r")/}

与bash @ruakh相比,这种方法的好处是这里你只使用了bash内置的,第一个会更快,因为第二个会在一个子subshell中运行。

如果您只想"unixize“$mean:

mean="${mean/^M/}"

编辑:还有另一种方法:

${mean/$'\r'/}

票数 2
EN

Stack Overflow用户

发布于 2012-03-20 06:17:32

在cygwin中运行Windows程序有一个令人讨厌的副作用--在cygwin bash变量中捕获Windows程序的输出也会捕获程序的CR输出。

明智地使用d2u可以避免这个问题--例如,

代码语言:javascript
运行
复制
runtime="`mediainfo --Inform='Video;%Duration%' ${movie} | d2u`"

(如果没有运行时,${ d2u }的末尾会附加一个CR,这会导致您在将其提供给'bc‘时看到的问题。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8316649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档