Shell脚本多行注释

时间:2015-08-27 12:58:01

标签: shell sed

我有一个大的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可能不是空的

我只想了解上述脚本的错误以及注释部分无法正常工作的原因。

4 个答案:

答案 0 :(得分:6)

首先,在这里使用docs来评论代码真的很脏!请改用#。如果要评论多行,请使用编辑器。在vim中(例如,从10到15的注释行):

:10,15s/^/#

但是,要解决当前问题,您需要将起始here-doc分隔符用单引号括起来,如下所示:

<<'COMMENT'
...
COMMENT

使用单引号告诉bash它不应该尝试在这里的doc体内扩展变量或表达式。

答案 1 :(得分:1)

传统的UNIX shell没有多行注释支持。你在这里做的是使用所谓的&#34; HERE文件&#34;没有使用它的价值,这是一种常见的黑客行为,可以获得多行评论,例如行为。

但仍然会评估HERE文档中的模式,这意味着您的$(…)已被执行。但由于之前未定义build_branch_tag,因此它将计算为空字符串,因此shell将执行sed s///g

你可以使用不同的黑客:

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

这是做什么的::是一个无操作命令,它什么都不做。并且你传递了一个字符串'…'的参数。在单引号内,没有进行扩展/评估。请注意&#34;注释中的'&#34;但是,地区。

答案 2 :(得分:1)

您可以在此文档中关闭参数替换,如下所示:

<<"Endofmessage"

<<'Endofmessage'

<<\Endofmessage

此处文件

  

这种重定向指示shell从中读取输入   当前源直到一行只包含分隔符(没有   可见尾随空白)。所有读到的那一行都是   然后用作命令的标准输入。格式   这里的文件是:

     

&LT;&LT; [ - ]字           here-document delimiter不执行参数扩展,命令替换,算术扩展或路径名扩展   在单词上。如果引用单词中的任何字符,则分隔符为   单词上的引号删除结果,以及here-document中的行   没有扩大。如果单词不加引号,则here-文档的所有行   受到参数扩展,命令替换和   算术扩展。在后一种情况下,字符序列   \被忽略,\必须用于引用字符\,   $,和`。如果重定向运算符是&lt;&lt; - ,那么所有前导选项卡   从输入行和包含的行中删除字符   分隔符。这允许shell脚本中的文档   以自然的方式缩进。

也许你可能也喜欢的东西:我更喜欢在我的bash脚本中使用nodepad ++快捷键ctrl + Q(切换注释)进行多行注释。

答案 3 :(得分: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错误或等效的(不成熟的地方,比如通过降低部分失败代码来查找错误)

#!/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是评论的第一行和最后一行)