2015-08-27 108 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