53

我想知道是否有办法在 shell 脚本中注释掉一组行。我怎么能那样做?我们可以在其他编程语言中使用 /* */。这在我转换/使用/修改另一个脚本并且我想保留原始行而不是删除时最有用。

为所有未使用的行查找和前缀 # 似乎是一项繁琐的工作。

假设脚本中有 100 行后续行中不使用。我想一口气把它们全部评论出来。那可能吗?

4

10 回答 10

48

最通用和最安全的方法是将注释放入 void quoted here-document中,如下所示:

<<"COMMENT"
    This long comment text includes ${parameter:=expansion}
    `command substitution` and $((arithmetic++ + --expansion)).
COMMENT

引用COMMENT上面的分隔符对于防止参数扩展、命令替换和算术扩展是必要的,否则会发生这种情况,正如 Bash 手册所述和 POSIX shell 标准指定的那样。

在上述情况下,不引用COMMENT将导致变量parameter 被分配 text expansion,如果它为空或未设置,则执行 command command substitution,递增 variablearithmetic和递减 variable expansion

将其他解决方案与此进行比较:

使用if false; then comment text fi要求注释文本在语法上是正确的 Bash 代码,而自然注释通常不是,如果只是为了可能的不平衡撇号。构造也是如此: || { comment text }

将注释放入单引号 void 命令参数中,如:'comment text',具有无法包含撇号的缺点。双引号的参数,如:"comment text",仍然受到参数扩展、命令替换和算术扩展的影响,与未引用的 here-document 内容相同,并且可能导致上述副作用。

使用脚本和编辑器工具自动为块中的每一行加上“#”前缀有一些优点,但并不能完全回答这个问题。

于 2013-10-04T13:23:39.493 回答
47
if false
then

...code...

fi

false总是返回 false 所以这总是会跳过代码。

于 2009-09-18T12:55:46.707 回答
28

您还可以使用以下方法放置多行注释:

: '
comment1comment1
comment2comment2
comment3comment3
comment4comment4
'

根据Bourne Shell 内置的 Bash 参考

: (冒号)

: [参数]

除了扩展参数和执行重定向之外什么都不做。返回状态为零。

感谢 Ikram 在帖子中指出这一点Shell script put multi line comment

于 2013-07-10T15:33:33.840 回答
21

您可以使用没有命令的“此处”文档将其发送到。

#!/bin/bash
echo "Say Something"
<<COMMENT1
    your comment 1
    comment 2
    blah
COMMENT1
echo "Do something else"

维基百科参考

于 2009-09-18T12:56:11.257 回答
10

文本编辑器有一个惊人的功能,叫做搜索和替换。你没有说你使用什么编辑器,但由于 shell 脚本往往是 *nix,而我使用 VI,这里是注释一些 shell 脚本的第 20 到 50 行的命令:

:20,50s/^/#/
于 2009-09-18T12:55:37.517 回答
5
: || {
your code here
your code here
your code here
your code here
}
于 2009-12-18T11:08:45.243 回答
2

如果您只是将代码包装到函数中怎么办?

所以这:

cd ~/documents
mkdir test
echo "useless script" > about.txt

变成这样:

CommentedOutBlock() {
  cd ~/documents
  mkdir test
  echo "useless script" > about.txt
}
于 2016-11-08T12:50:26.243 回答
1

根据这个网站

#!/bin/bash
foo=bar
: '
This is a test comment
Author foo bar
Released under GNU 
'

echo "Init..."
# rest of script
于 2016-12-26T04:02:08.437 回答
0

根据您使用的编辑器,有一些快捷方式可以注释一行代码。

另一种解决方法是将您的代码放在“if (0)”条件块中;)

于 2009-09-18T12:55:06.797 回答
-1

这个 Perl 单行注释掉文件的第 1 到 3 行orig.sh(第一行编号为 0),并将注释版本写入cmt.sh.

perl -n -e '$s=1;$e=3; $_="#$_" if $i>=$s&&$i<=$e;print;$i++' orig.sh > cmt.sh

显然,您可以根据需要更改边界数。

如果您想就地编辑文件,它甚至更短:

perl -in -e '$s=1;$e=3; $_="#$_" if $i>=$s&&$i<=$e;print;$i++' orig.sh

演示

$ cat orig.sh 
a
b
c
d
e
f

$ perl -n -e '$s=1;$e=3; $_="#$_" if $i>=$s&&$i<=$e;print;$i++' orig.sh > cmt.sh

$ cat cmt.sh 
a
#b
#c
#d
e
f
于 2009-09-18T13:56:37.550 回答