![bash 函数将注释写入新创建的文件](https://linux22.com/image/1351075/bash%20%E5%87%BD%E6%95%B0%E5%B0%86%E6%B3%A8%E9%87%8A%E5%86%99%E5%85%A5%E6%96%B0%E5%88%9B%E5%BB%BA%E7%9A%84%E6%96%87%E4%BB%B6.png)
请参阅以下函数——
function touchm(){
date=$(date +'%Y-%m-%d %H:%M:%S')
read Y M D h m s <<< ${date//[-: ]/ }
file_name=$1
if [[ $file_name =~ ^[0-9a-zA-Z+_-]+.[py|pl|rb|sh] ]]; then
echo "#
# $file_name
#
# Created by $MASTER on $M/$D/$Y at $h:$m:$s
# Copyright (c) $Y $MASTER. All rights reserved.
#
" > $1
elif [[ $file_name =~ ^[0-9a-zA-Z+_-]+.[m|h|c|cpp|] ]]; then
echo "//
// $file_name
//
// Created by $MASTER on $M/$D/$Y at $h:$m:$s
// Copyright (c) $Y $MASTER. All rights reserved.
//
" > $1
elif [[ $file_name =~ ^[0-9a-zA-Z+_-]+.[ml] ]]; then
echo "(* *)
(* $file_name *)
(* *)
(* Created by $MASTER on $M/$D/$Y at $h:$m:$s *)
(* Copyright (c) $Y $MASTER. All rights reserved. *)
(* *)
" > $1
else
echo "What bullshit. Give me a good file name"
fi
}
所以每当我执行:
touchm 2-r_f.ml
这应该会生成一个带有 ml 类型注释的 ml 文件。但它并没有这样做。它生成 c 类型注释。
此外,我还需要适应 + 和 _(下划线),但目前它似乎不起作用。这是一个糟糕的正则表达式吗?如果是这样,我可以获得纠正它的指针吗?
谢谢
答案1
您可以尝试使用 cat 来执行此操作,即
cat << EOF > 输出文件名
# $file_name
#
# 由 $MASTER 于 $M/$D/$Y 的 $h:$m:$s 创建
# 版权所有 (c) $Y $MASTER。保留所有权利。
#
EOF
如果您想缩进上面的代码,请将 << 更改为 <<-,这将删除前导制表符。
而且,是的,这是一个糟糕的正则表达式。字符类(方括号)不需要管道,这是用于在圆括号内进行替代匹配。你想要类似的东西:
替换:$file_name =~ ^[0-9|az|AZ|-].[ml]
其中:$file_name =~ ^[0-9a-zA-Z+_-].[毫升]
您还可以用 + 替换 * 以表示 1 或更多,因为该正则表达式也会匹配“.ml”。确保连字符是字符类中的最后一个字符,否则它会假定您指定的是范围。
编辑:试试这个,刚刚用 .sh、.cpp 和 .ml 文件测试过。出于好奇,第三个 if 语句应该是针对 .ml,还是 .m 或 .l,就像你似乎要匹配的那样?第二个 if 语句也匹配 .m,所以其中一个可能是错误的,下面的代码假设第三个 if 应该是 .ml
function touchm(){
date=$(date +'%Y-%m-%d %H:%M:%S')
read Y M D h m s <<< ${date//[-: ]/ }
file_name=$1
if [[ $file_name =~ ^[0-9a-zA-Z+_-]+\.(py|pl|rb|sh)$ ]]; then
echo "\#
# $file_name
#
# Created by $MASTER on $M/$D/$Y at $h:$m:$s
# Copyright (c) $Y $MASTER. All rights reserved.
#
" > $1
elif [[ $file_name =~ ^[0-9a-zA-Z+_-]+\.(m|h|c|cpp)$ ]]; then
echo "//
// $file_name
//
// Created by $MASTER on $M/$D/$Y at $h:$m:$s
// Copyright (c) $Y $MASTER. All rights reserved.
//
" > $1
elif [[ $file_name =~ ^[0-9a-zA-Z+_-]+\.ml$ ]]; then
echo "(* *)
(* $file_name *)
(* *)
(* Created by $MASTER on $M/$D/$Y at $h:$m:$s *)
(* Copyright (c) $Y $MASTER. All rights reserved. *)
(* *)
" > $1
else
echo "What bullshit. Give me a good file name"
fi
}