2013-11-26 125 views
1

我有一個Bash腳本的集合,並希望能夠解析它們以提取它們的定義。解析BASH腳本中的heredoc評論

如果我形成使用here文檔的註釋塊下面的腳本(AB)在我的描述,將這個提議的任何好處:

#!/bin/bash 

DESCRIPTION = <<EOD 

This nifty script does x, y and sometimes z 

EOD 

# rest of script... 

過來:

#!/bin/bash 

# Description 
# ========== 
# 
# This nifty script does x, y and sometimes z 

# rest of script... 

即有一個簡單的方法讓我從Bash腳本中提取一個變量,或者我需要編寫一個腳本來將正確格式化的描述塊的文件從# Description解析到下一個空白行?

更新

很多關於這個偉大的答案。我選擇了適合我的用例和偏好的那個,但都是Bash註釋實現的很好例子。

回答

2

我認爲這是你想要什麼。

#!/bin/bash 

[ "$1" = "DESCRIPTION" ] && cat <<EOD && exit 

Hello, this is the ${1} 

This nifty script does x, y and sometimes z 
The nice thing is that linebreaks will be preserved. 
This makes it a "useful" 'here document' 

no problem with 'single' or "double" quotes 
nothing matters much except variables 

EOD 


rest of script... 

的偉大工程:-)

+0

這很好,謝謝! –

2

在提取信息的難度方面沒有實際差異。評論具有不可執行的溫和好處,所以對於不創建$DESCRIPTION變量而言,性能有一點好處,但是很難衡量它。

當然,還有一個額外的問題,即顯示的heredoc語法不是有效的shell。你需要考慮在以下方面:

cat >/dev/null <<EOD 
... 
EOD 

或可能(但也許不是 - 除非你想在腳本本身使用$DESCRIPTION):

DESCRIPTION=$(cat <<EOD 
... 
EOD 
) 

,或者更好依舊:

: DESCRIPTION = <<EOD 
... 
EOD 

冒號命令是無操作;它評估其論點並取得成功。我更喜歡這個到cat變種。參數DESCRIPTION=是噪音詞;您可以忽略其中一個或兩個而不影響腳本。你可能會想考慮使用第一EOD太各地報價:

: <<'EOD' 
...$(cat this is not executed)... 
EOD 

注意,:命令和第一cat替代不初始化shell變量$DESCRIPTION。如果這一點很重要,那麼你會被替換爲$(...)版本,注意到有兩行標記了作業的結尾。

2

讓您的描述行以一個唯一的標識符,這樣的事情:

(例如我們把字符:#>)

#!/bin/bash 

#> This is a description header 
#> 
#> This program will do z, y and X 
#> because I want that 

# this is normal comment 

.... rest of program 
or some other stuff 

爲了讓你的描述:

grep "^#>" myscript.sh 

將導致:

#> This is a description header 
#> 
#> This program will do z, y and X 
#> because I want that 

這比設法得到比較容易的方式:(只能通過部分採購這....這是蠕蟲的另一個可以做到)

  1. 變出文檔 的

  2. 試圖檢索(EOD)標記之間的部分

  3. 試圖啓發式地確定哪些是評論或哪些是描述。

1

讓變量包含描述的想法非常有趣。

從程序中檢索它的最好方法是讓程序爲你打印它。 請勿使用除單引號或雙引號以外的任何其他語言,因爲這是將變分符合併到變量中的唯一方法。 我們也可以通過直接回顯字符串來繞過變量的需要。

你可以有:

#!/bin/bash 
#--------------------------------- 
[ "$1" = "DESCRIPTION" ] && echo ' 

Hello, 

This nifty script does x, y and sometimes z 
The nice thing is that linebreaks will be preserved. 
This makes it as useful as a here document 

you can choose between single or double quotes 

' && exit 
#--------------------------------- 

rest of script... 

它看起來並不很漂亮(雖然不壞),但以便在檢索的描述極其簡單,無需額外的工具:

scriptname.sh DESCRIPTION 
+0

我真的很喜歡這如何不需要額外的工具來抓住從CLI的說明。有沒有什麼辦法可以調整它忽略描述文本中的單引號而不用擔心格式化? –

+0

是的,如果您使用雙引號作爲開始和結束標記,則可以在文本中使用單引號(反之亦然)。 – thom

+0

還有另一種方法。我會把它作爲另一個答案。 – thom