哈嘍大家好,我是鹹魚 在《[SELinux 入門 pt.1](https://mp.weixin.qq.com/s?__biz=MzkzNzI1MzE2Mw==&mid=2247486365&idx=1&sn=4b81b3cc70b085eec6f0a595fda719fb&chksm=c2930b ...
[20230826]dc命令複雜學習2.txt
--//昨天做了累加的例子,並解析命令裡面的意思.今天嘗試做一個階乘的例子.
$ seq 5 | dc -f - -e "[*z1<r]srz1<rp"
120
--//很簡單就是裡面的+換成了*,實際上我使用seq 5傳了5個參數.如果傳入1個呢?
--//假設做10的階乘.
$ echo 10*9*8*7*6*5*4*3*2*1 | bc
3628800
$ dc -e "[la 1 - sa la * la 1<r]sr" -e "10 sa la la 1<r p"
3628800
$ seq 10 | dc -f - -e "[*z1<r]srz1<rp"
3628800
$ echo 10 | dc -e "[la 1 - sa la * la 1<r]sr" -f - -e "sa la la 1<r p"
3628800
--//簡單解析:
--// [la 1 - sa la * la 1<r]sr -> 保存字元串 la 1 - sa la * la 1<r 到寄存器r,這也是迴圈運算的主體.
--// -f - ,也就是信息來自管道,也就是將10壓入堆棧.
--// sa la la 1<r ,sa將10保存到寄存器a,la la將10從寄存器a取出2次, 1< 比較1<10為真調用寄存器r執行.
sr
Pop the value off the top of the stack and store it into register r.
推出頂端的堆棧值進入記憶體寄存器,保存到寄存器r。
lr
Copy the value in register r and push it onto the stack. This does not alter the contents of r.
Each register also contains its own stack. The current register value is the top of the register's stack.
複製寄存器r中的值,並將其推到堆棧中。這並不改變r的內容。每個寄存器還包含它自己的堆棧。當前的寄存器值是寄存器的堆棧的頂部
。
--//迴圈主體:
--//la 1 - sa la * la 1<r
--//la將10從寄存器a取出,
--//1 - 減1,變成9 .
--//sa la sa保存9到寄存器a.la將9從寄存器a取出.
--//* 做乘法運算 10 * 9 = 90
--//la la將9從寄存器a取出.
--//1<r 比較1<9為真調用寄存器r執行.如此迴圈.
--//將裡面la換成d結果一樣.
$ echo 10 | dc -e "[la 1 - sa la * la 1<r]sr" -f - -e "sa la d 1<r p"
3628800
--//解析d命令:
d
Duplicates the value on the top of the stack, pushing another copy of it. Thus, ''4d*p'' computes 4 squared and prints
it.
複製堆棧頂部的值,然後推入它的另一個副本。因此,"4d*p"計算4個平方並列印它
--//也可以先壓入10個數字,然後再做乘法運算.
$ echo 10 | dc -e "[la 1 - sa la la 1<r]sr" -f - -e "sa la la 1<rf"
1
2
3
4
5
6
7
8
9
10
$ echo 10 | dc -e "[la 1 - sa la la 1<r]sr" -f - -e "sa la la 1<r" -e "[*z1<b]sbz1<bp"
3628800
$ echo 1 | dc -e "[la 1 + sa la la 10>r]sr" -f - -e "sa la la 10>rf"| dc -f - -e "[*z1<b]sbz1<bp"
3628800
$ dc -e "$(seq 10)[*z1<b]sbz1<bp"
3628800