我对一个角色有意见。我认为这是一个dos和unix之间的转换问题。
我有一个变量,它是一个浮点值。当我使用echo命令打印它时,我得到:
0.495959
但是当我尝试使用bc命令对该值进行操作时(我不确定如何编写bc命令)。
echo $mean *1000 |bc
我得到了:
(standard_in) 1 : illegal character: ^M
我已经在我的.sh文件上使用了dos2unix命令。我想这是因为我的变量有^M字符(没有用echo命令打印)
如何消除此错误?
发布于 2011-11-30 03:59:46
我手头上没有Cygwin,但是在常规的Bash中,您可以使用tr -d
命令删除指定的字符,并且可以使用$'...'
表示法在命令行参数中指定奇怪的字符(它类似于普通的单引号字符串,只是它支持类似C/Java/Perl/等的转义序列)。所以,这是:
echo "$mean" * 1000 | tr -d $'\r' | bc
将在从echo
到bc
的过程中去掉回车。
您可能真的想要运行以下命令:
mean=$(echo "$mean" | tr -d $'\r')
它将修改$mean
,去掉其中的任何回车符,这样您就不必在后面使用它的命令中担心它了。
(不过,首先看看设置$mean
的代码也是值得的。不管怎么说,$mean
怎么会有一个回车呢?也许你可以解决这个问题。)
发布于 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'/}
发布于 2012-03-20 06:17:32
在cygwin中运行Windows程序有一个令人讨厌的副作用--在cygwin bash变量中捕获Windows程序的输出也会捕获程序的CR输出。
明智地使用d2u可以避免这个问题--例如,
runtime="`mediainfo --Inform='Video;%Duration%' ${movie} | d2u`"
(如果没有运行时,${ d2u }的末尾会附加一个CR,这会导致您在将其提供给'bc‘时看到的问题。)
https://stackoverflow.com/questions/8316649
复制相似问题