2015-08-27 107 views
2

我有一個大的shell腳本文件。有時在做修改時,我想評論一下它的一部分。但是如下例所示的註釋行給我錯誤。shell腳本多行註釋

腳本:

#!/bin/bash 
<<COMMENT1 
read build_label 
read build_branch_tag 
build_date_tag=$(echo $build_label | sed "s/$build_branch_tag//g") 
echo $build_path 
COMMENT1 
echo "HELLO WORLD" 

錯誤消息:

sed的:第一RE不能爲空

我只是想了解有什麼錯上面的腳本,爲什麼評論部分工作不正常。

+1

你可以嘗試添加一個':了'<< COMMENT1'之前'和單引號?所以它看起來像:':''COMMENT1'' – ryekayo

+0

@ryekayo:謝謝你的建議。它似乎工作正常。 – Cheran

+0

可以在這裏找到一個很好的解釋:http://unix.stackexchange.com/questions/37411/multiline-shell-script-comments-how-does-this-work但是,它更安全地使用'#'來評論多個行和我提供的鏈接將解釋爲什麼。 – ryekayo

回答

6

首先,在這裏使用docs來評論代碼真的很髒!改爲使用#。如果你想評論多行,請使用你的編輯器。在VIM(註釋10行至15爲例):

:10,15s/^/# 

但是,要解決當前的問題,需要封閉從這裏開始-doc的分隔符的單引號,像這樣:

<<'COMMENT' 
... 
COMMENT 

使用單引號告訴bash它不應該嘗試擴展這裏doc文檔體內的變量或表達式。

+0

Oooh,我不知道你可以通過在HERE分隔符周圍使用引號來關閉擴展。太好了! – DarkDust

+0

是的,很高興擁有!我希望我能在未來逃離一些...... – hek2mgl

0

傳統的UNIX shell不支持多行註釋。你在這裏做的是使用所謂的「HERE文檔」而不使用它的價值,這是一種常見的黑客行爲,可以獲得多行評論。

但是,HERE文檔中的模式仍在評估中,這意味着您的$(…)已被執行。但由於build_branch_tag之前沒有定義過,因此它將評估爲空字符串,並且shell將執行sed s///g

您可以使用不同的黑客:

: ' 
Bla bla, no $expansion is taking place here. 
' 

這是什麼做的:在:是無操作命令,它只是什麼都不做。你傳遞一個參數,它是一個字符串'…'。在單引號內,沒有展開/評估。不過,請注意'在「註釋掉」區域內。

+0

我會更強調你的最後一句話。 –

0

如果這不是語法錯誤(打開字符串,...)

#!/bin/bash 

if false;then 
read build_label 
read build_branch_tag 
build_date_tag=$(echo $build_label | sed "s/$build_branch_tag//g") 
echo $build_path 
fi 

echo "HELLO WORLD" 

如果sysntax錯誤或同等學歷(unfound地方能像在搜索錯誤的通過而失敗代碼descativate部分)

#!/bin/bash 

#read build_label 
#read build_branch_tag 
#build_date_tag=$(echo $build_label | sed "s/$build_branch_tag//g") 
#echo $build_path 

echo "HELLO WORLD" 

對於這一點,你可以使用: - 編者如果找到正則表達式/替換是可用的像vi(m) - sed(sed '14,45 s/^/#/' YourFile > YourFile.Debug其中14和45是第一行和最後一行註釋)

1

您可以在這裏關閉參數替換文檔如下:

<<"Endofmessage" 

<<'Endofmessage' 

<<\Endofmessage 

這裏文獻

這種類型的重定向指示殼讀取來自 電流源輸入直到僅含有線分隔符(沒有 尾隨空白)被看到。到此爲止讀取的所有行都是 ,然後用作命令的標準輸入。的 這裏的文檔的格式是:

< < [ - ]字01​​這裏文檔定界符否參數擴展,命令替換,算術擴展,或路徑擴展是在字進行 。如果引用了單詞中的任何字符,則分隔符是 單詞上的引號刪除結果,並且此處的文檔 中的行不會展開。如果字未加引號,則此處文檔 的所有行均受參數擴展,命令替換和算術擴展的限制。在後一種情況下,字符序列 \將被忽略,\必須用於引用字符\, $和`。如果重定向操作符爲< < - ,則所有前導製表符 字符將從輸入行和包含 分隔符的行中剝離。這允許在這裏 - shell腳本中的文檔是以自然方式縮進的 。

也許你可能會喜歡的東西:我更喜歡在我的bash腳本中用nodepad ++快捷鍵ctrl + Q(切換評論)做多行註釋。

0

使用此文檔進行評論的代碼是安全和優雅是這樣的:

: <<'EOT' 
Example usage of the null command ':' and the here-document syntax for a 
multi-line comment. If the delimiter word ('EOT' here) is quoted, the 
here-document will not be expanded in any way. This is important, as 
an unquoted delimiter will result in problems with unintended potential 
expansions. All of this here-doc text is redirected to the standard input 
of :, which does nothing but return true. 
EOT