我有一个大的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可能不是空的
我只想了解上述脚本的错误以及注释部分无法正常工作的原因。
答案 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是评论的第一行和最后一行)