哈嘍大家好,我是鹹魚 在《[SELinux 入門 pt.1](https://mp.weixin.qq.com/s?__biz=MzkzNzI1MzE2Mw==&mid=2247486365&idx=1&sn=4b81b3cc70b085eec6f0a595fda719fb&chksm=c2930b ...
[20230825]dc命令複雜學習.txt
--//前幾天學習dc使用,我當時最後舉了一個累加的例子,裡面
--//-e後面那一串什麼意思,即使看了man dc文檔,我當時也沒看懂表示什麼意思.嘗試看了man文檔,簡單解析如下:
--//我從文檔裡面取出相關說明:
[characters]
Makes a string containing characters (contained between balanced [ and ] characters), and pushes it on the stack.For
example, [foo]P prints the characters foo (with no newline).
生成一個包含字元的字元串(包含在平衡的[和]字元之間),並將其推到堆棧上。例如,[foo]P列印字元文件(沒有換行符)。
sr
Pop the value off the top of the stack and store it into register r.
推出頂端的堆棧值進入記憶體寄存器,保存到寄存器r。
z
Pushes the current stack depth: the number of objects on the stack before the execution of the z command.
推動當前堆棧深度:在執行z命令之前,堆棧上的對象數。
>r
Pops two values off the stack and compares them assuming they are numbers, executing the contents of register r as a
macro if the original top-of-stack is greater. Thus, 1 2>a will invoke register a's contents and 2 1>a will not.
從堆棧中彈出兩個值,並比較它們,假設它們是數字,執行寄存器r的內容作為一個巨集,如果原始的堆棧頂部更大。因此,1 2>a 將調用
註冊a的內容,而 2 1>a將不會。
--//主要為了下麵<r的解析.
<r
Similar but invokes the macro if the original top-of-stack is less.
類似的方法,但如果原始的堆棧頂部較少,則調用巨集。
p
Prints the value on the top of the stack, without altering the stack. A newline is printed after the value.
在堆棧的頂部列印該值,而不更改堆棧。在該值後將列印一個換行符。
f
Prints the entire contents of the stack without altering anything. This is a good command to use if you are lost or want
to figure out what the effect of some command has been.
列印堆棧的全部內容,而不改變任何內容。如果您丟失或想要使用這個命令,這是一個很好的命令來弄清楚一些命令的效果。
--//這樣累加例子的腳本解析如下,要有點耐心還是很容易讀懂的:
$ cat a.txt
1111
2222
3333
4444
$ cat a.txt | dc -f - -e "[+z1<r]srz1<rp"
11110
--//解析如下:
1111
2222
3333
4444
[+z1<r]
--//將上面文件a.txt的內容以及[+z1<r] 壓入堆棧.
sr -> 保存字元串 +z1<r 到寄存器r,並且出棧.
z -> 指當前堆棧的數量.並將它推入堆棧.
1<r -> 如果1<(堆棧的數量),調用巨集r.也就是執行+z1<r,也就是先相加 ,剩下的只要1<(堆棧的數量)不斷的調用r.
--//我修改如下,加入f命令顯示堆棧內容,就很清晰了.
$ cat a.txt | dc -f - -e "[+z1f<r]fsrz1f<rp"
+z1f<r
4444
3333
2222
1111
--//第1次執行f顯示堆棧的情況.+z1f<r 作為字元串最後壓入堆棧. 相當於執行fsrz1f<rp裡面的f命令.
1
4
4444
3333
2222
1111
--//執行srz1f<r,sr保存字元串 +z1f<r 保存到寄存器r,並且字元串出棧.z 指當前堆棧的數量4(因為字元串已經出棧).並將它推入堆棧.
--//1 推入堆棧
--//第2次執行f 顯示堆棧的情況(如上). <r 1<4為真,調用寄存器r的內容.也就是執行 +z1f<r.只要1<當前堆棧的數量,調用寄存器r的內容.
1
3
7777
2222
1111
--//第3次執行f顯示堆棧的情況.
1
2
9999
1111
--//第4次執行f顯示堆棧的情況.
1
1
11110
--//第5次執行f顯示堆棧的情況. 1<1 為假,不再調用巨集r.
11110
--//第6次執行p輸出結果.
--//也可以這樣執行:
$ cat a.txt | dc -e "[+z1f<r]sr" -f - -e "z1f<rp"
1
4
4444
3333
2222
1111
1
3
7777
2222
1111
1
2
9999
1111
1
1
11110
11110
$ cat a.txt | dc -e "[+z1<r]sr" -f - -e "z1<rp"
11110
總結:
--//也就是靜下心來,還是很容易理解的.