让 GNU bc 打印换行符

让 GNU bc 打印换行符

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,使用双引号表示\ns,它确实有效

$ 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 的基数中保留为常量/数字

相关内容