按照此處描述的原始問題:- 翻錄 DVD 的章節以分離文件
..有人可以幫助我們理解下面的程式碼在做什麼嗎:-
# count Titles, and count Cells per title.
# eg. ${cell[1]} is the Count of Cells for the first title
# ${cell[titles]} is the Count of Cells for the last title
eval $(lsdvd | sed -n 's/Title: \([0-9]\+\), .* Chapters: \([0-9]\+\), Cells: .*/cells[$((10#\1))]=$((10#\2));/p')
titles=${#cells[@]} title_num=2 from_cell=1 to_cell=${cell[title_num]}
我們想做同樣的事情並嘗試使用該程式碼。不幸的是,它對我們不起作用,並且由於我們的理解有限,我們無法調試它。
我們了解使用 sed 的基本思想,但無法理解它是如何做到的:-
- 解析任何模式以進行替換。
- 產生任何模式來替換。
而且,它與 eval() 的耦合超出了我們的範圍。另外,# 還有三種用途,我們也沒得到。
請幫忙。謝謝。
答案1
首先,既然你沒有提到它,我假設這是一個 bash 腳本。
這兩行的高級說明是它們從 的輸出中提取標題編號和章節編號lsdvd
並將它們儲存在名為 的陣列中cells
。
給出的代碼可能不起作用,因為to_cell=${cell[title_num]}
最後一行應該是to_cell=${cells[title_num]}
.
以下是更詳細的細分:
此指令在 的輸出中搜尋和sed
後面的數字。 然後將這些數字分別儲存在和中。 輸出 形式的字串,用標題和章節號替換反斜線引用。Title:
Chapters:
lsdvd
sed
\1
\2
sed
cells[$((10#\1))]=$((10#\2))
我相信您也對$((10#x))
文法感到困惑。詳細說明如下:$((expression))
在 bash 中,意思是“視為expression
算術表達式並對其求值”,y#x
而是算術表達式,意思是“視為x
基數y
並將其轉換為十進制”。例如,2#10
計算結果為2
(因為 10 代表基數 2 中的 2),10#10
計算結果為10
(因為將基數 10 數字轉換為十進制不會執行任何操作)並3#4
拋出錯誤(因為“4”不是基數3 中的合法符號) 。更多資訊可從ARITHMETIC EVALUATION
部分獲得man bash
。
因此該sed
命令僅輸出一個如下所示的字串:cells[$((10#x))]=$((10#y))
其中x
和y
是數字。這被傳遞到eval
.我想你現在已經足夠了解了,評估這個字串只會導致 bash 中的標準數組賦值,因為在評估算術表達式之後,字串看起來像cells[x]=y
.
最後一行只是一些額外的變數賦值,有一個技巧。${#cells[@]}
僅計算數組中的項目數cells
。
這就是它的要點。