【发布时间】:2010-11-29 11:38:00
【问题描述】:
我想知道是否有办法在 shell 脚本中注释掉一组行。 我怎么能那样做?我们可以在其他编程语言中使用 /* */。 这在我转换/使用/修改另一个脚本时最有用 我想保留原来的行而不是删除。
为所有未使用的行查找和前缀#似乎是一项繁琐的工作。
假设脚本中有 100 行后续行不使用。 我想一口气把它们全部评论出来。这可能吗?
【问题讨论】:
标签: unix shell comments editing
我想知道是否有办法在 shell 脚本中注释掉一组行。 我怎么能那样做?我们可以在其他编程语言中使用 /* */。 这在我转换/使用/修改另一个脚本时最有用 我想保留原来的行而不是删除。
为所有未使用的行查找和前缀#似乎是一项繁琐的工作。
假设脚本中有 100 行后续行不使用。 我想一口气把它们全部评论出来。这可能吗?
【问题讨论】:
标签: unix shell comments editing
最通用和最安全的方法是将注释放入无效引用中
here-document,像这样:
<<"COMMENT"
This long comment text includes ${parameter:=expansion}
`command substitution` and $((arithmetic++ + --expansion)).
COMMENT
引用上面的COMMENT定界符是必要的,以防止参数
扩展,命令替换和算术扩展,这将发生
否则,作为 Bash 手册 states 和 POSIX shell 标准 specifies。
在上述情况下,不引用 COMMENT 将导致变量 parameter
被分配文本expansion,如果它为空或未设置,则执行命令
command substitution,递增变量arithmetic 并递减
变量expansion。
比较其他解决方案:
使用if false; then comment text fi 要求评论文本是
语法正确的 Bash 代码,而自然 cmets 通常不是,如果
仅用于可能的不平衡撇号。 : || { comment text } 也是如此
构造。
将 cmets 放入单引号 void 命令参数中,如 :'comment
text',具有无法包含撇号的缺点。双引号
参数,如:"comment text",仍受参数扩展的影响,
命令替换和算术扩展,与未引用的相同
here-document 内容,并可能导致上述副作用。
使用脚本和编辑器工具自动为每行添加前缀 带有“#”的块有一些优点,但不能完全回答问题。
【讨论】:
if false
then
...code...
fi
false 总是返回 false 所以这总是会跳过代码。
【讨论】:
您也可以使用以下方式放置多行 cmets:
: '
comment1comment1
comment2comment2
comment3comment3
comment4comment4
'
根据 Bourne Shell builtins 的 Bash 参考
:(冒号)
:[参数]
除了扩展参数和执行重定向之外什么都不做。返回状态为零。
感谢 Ikram 在帖子 Shell script put multiple line comment 中指出这一点
【讨论】:
: ' : 打开和关闭您的评论。 :)
您可以使用“此处”文档而无需发送命令。
#!/bin/bash
echo "Say Something"
<<COMMENT1
your comment 1
comment 2
blah
COMMENT1
echo "Do something else"
【讨论】:
文本编辑器有一个很棒的功能,叫做搜索和替换。你没有说你使用什么编辑器,但由于 shell 脚本往往是 *nix,而我使用 VI,这里是注释某些 shell 脚本的第 20 到 50 行的命令:
:20,50s/^/#/
【讨论】:
: || {
your code here
your code here
your code here
your code here
}
【讨论】:
if false; then … fi 好,因为它不会从语法分析中隐藏[可能格式错误的]代码。
如果你只是将代码包装到函数中呢?
所以这个:
cd ~/documents
mkdir test
echo "useless script" > about.txt
变成这样:
CommentedOutBlock() {
cd ~/documents
mkdir test
echo "useless script" > about.txt
}
【讨论】:
据此site:
#!/bin/bash
foo=bar
: '
This is a test comment
Author foo bar
Released under GNU
'
echo "Init..."
# rest of script
【讨论】:
根据您使用的编辑器,有一些快捷方式可以注释一行代码。
另一种解决方法是将您的代码放在“if (0)”条件块中;)
【讨论】:
if (0); then 会一直执行
这个 Perl 单行代码删除文件 orig.sh 的第 1 到 3 行(第一行编号为 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
【讨论】:
echo -e "1\n2\n3\n4\n5\n6" | sed -e "2,4 s/^/#/"