繁体   English   中英

如何从 bash 脚本中删除注释

[英]how to remove comments from a bash script

我正在尝试制作一个将脚本文件作为参数获取的脚本。 它应该从文件中删除注释并将其通过管道传输到另一个脚本。 (如果可能,没有临时文件)

一开始我就想这样做

cut -d"#" -f1 $1 | ./script_name

但它也会清除一部分不是注释的行,因为有一些命令在其中使用 # (例如计算字符串字符)。

有没有没有临时文件的方法?

这是从脚本文件中删除注释的一种非常特定于 bash 的方法。 它还删除了 she-bang 线,如果有的话(毕竟,这是一条评论),并进行一些重新格式化:

tmp_="() {
$(<script_name)
}" bash -c 'declare -f tmp_' | tail -n+2

这会将脚本转换为函数,并使用bash内置declare来漂亮地打印结果函数( tail删除函数名称,但不删除周围的大括号;更复杂的后期处理也可以删除它们,如果被认为是必要的)。

漂亮打印在子bash进程中完成,既可以避免临时函数污染执行环境,又因为子进程将有效地将变量的字符串值识别为函数。

更新:

可悲的是,上述 shellshock 后不再有效。 但是,对于修补的 bash,以下可能会:

env "BASH_FUNC_tmp_%%=() {
$(<script_name)
}" bash -c 'declare -f tmp_' | tail -n+2

另请注意,此方法不会删除命令或进程替换内部的注释。

您可以将内联sed 与更好的正则表达式一起使用:

sed -i.bak '/^[[:blank:]]*#/d "$1"
  • ^[[:blank:]]*#将匹配#仅当每行前面有可选空格时
  • -i.bak选项将使用.bak作为备份文件的扩展名内联编辑输入文件,以防出现问题。

是的,通常这种类型的问题可以在没有临时文件的情况下解决。

然而,这也取决于确定注释定界符何时实际上不引入注释所需的解析的复杂性。

使用 python3 并安装pygments

from pygments.lexers.shell import BashLexer
from pygments.token import Token, is_token_subtype

def delete_comments(fname):
    src = open(fname, "r").read()
    dst = open(fname, "w")
    for token in BashLexer().get_tokens(src):
        
        if not (is_token_subtype(token[0], Token.Comment)):
            dst.write(token[1])
        
        if token[0] == Token.Comment.Hashbang:
            dst.write(token[1])

if __name__ == "__main__":
    delete_comments("/path/to/your/shellScript.sh")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM