GNU bc 非常不合常规。我在网上找不到任何关于如何让它打印换行符的信息。我试图让它打印从 1 到 30 的整数正弦的前 16 位十六进制数字。我希望像这样的东西能起作用:
define mod(x, y) {
oldscale=scale;
scale=0;
result=x%y;
scale=oldscale;
return result;
}
obase=16;
x=1;
while (x <= 30) {
X=2^64*mod(s(x),1)-mod((2^64*mod(s(x),1)),1);
print X"\n";
x=x+1;
}
但事实并非如此。
答案1
刚刚发现另一个可能的问题:如果您使用大写X
字符,当我尝试使用它时就会发生这种情况bc
:
X=3
(standard_in) 16: illegal character: X
(standard_in) 16: syntax error
显然,只有小写字符才是变量(来自手册页:输入数字可以包含字符0-9和AF。(注意:必须大写。小写字母为变量名)。
因此,更改为不同的小写字符(因为已经有另一个小写字母x
)是个好主意。
我刚刚尝试了一些非常基本的测试,显然print
使用bc
可以不是打印尾随换行符。只需将变量/数字放在其自己的行上做打印换行符:
$ echo "x=5; print x; print 999; x; 15; print 15; 12345"|bc
59995
15
1512345
那么,用print x"\n";
just 替换你的线路x;
就可以了吗?
并且,使用\n
带有打印也应该可以工作,也许你遇到了引用问题...当我尝试bc
使用双双引号(肯定是错误的;-)或使用单引号的双引号回应\n
时失败了:
$ echo "x=5; print x; print 999; x; 15; print "15\n\n\n"; 12345"|bc
(standard_in) 1: syntax error
$ echo "x=5; print x; print 999; x; 15; print '15\n\n\n'; 12345"|bc
(standard_in) 1: illegal character: '
(standard_in) 1: illegal character: \
(standard_in) 1: syntax error
(standard_in) 1: illegal character: \
(standard_in) 1: illegal character: \
(standard_in) 1: illegal character: '
但是使用单引号表示 echo,使用双引号表示\n
s,它确实有效
$ echo 'x=5; print x; print 999; x; 15; print "15\n\n\n"; 12345'|bc
59995
15
15
12345
那么,用 替换你的print x"\n";
线路print "x\n";
也应该可以吗?
引自man bc
:
打印列表
打印语句(扩展)提供了另一种输出方法。“列表”是用逗号分隔的字符串和表达式的列表。每个字符串或表达式都按列表的顺序打印。不打印终止换行符。表达式被求值,它们的值被打印并最后分配给变量。打印语句中的字符串被打印到输出中,并且可能包含特殊字符。特殊字符以反斜杠字符 (\) 开头。bc 识别的特殊字符是“a”(警报或铃声)、“b”(退格)、“f”(换页符)、“n”(换行符)、“r”(回车符)、“q”(双引号)、“t”(制表符)和“\”(反斜杠)。反斜杠后面的任何其他字符都将被忽略。
答案2
要打印换行符,请使用一个语句,该语句只是包含换行符的字符串文字。不是\n
,而是真正的换行符:
"
"
这应该会在你的输出中显示为换行符。
答案3
该行在print "\n"
bc 中打印换行符。该print
命令采用逗号分隔的列表,因此要在变量值后打印换行符,您需要将 a 添加"\n"
到打印列表中。您的行应该是
print X, "\n";
但作为307834 点,不应使用大写字母X
作为变量;大写字母在大于 10 的基数中保留为常量/数字。