想要编写一个bash脚本来自动创建程序文件

想要编写一个bash脚本来自动创建程序文件

我想编写一个 bash 脚本,它可以:

  1. 创建一个由用户输入特定名称的文件。如果用户未输入名称,则应提供默认名称,但同时检查该名称是否存在。
  2. 允许用户输入更多变量,用于填充该程序文件,包括填充注释部分(例如 author_name)

我没有太多编写 bash 脚本的经验,所以请提供一些小代码示例。非常感谢!

附言:我猜这很像npm init创建package.json文件的脚本。我找不到那个脚本,所以如果它是开源的,请提供一个链接(如果有的话)。

到目前为止我已经写了这个:

骨骼:

/*
 * URL : 
 * Author: John M.
 * Timestamp: 
 */

#include <iostream>
#include <algorithm>
#include <vector> 

using namespace std;

int main(int argc, char* argv[]) {
    // code
}

骨架

#!/bin/bash

created=0
while [ $created==0 ]; do
    read -p "Enter name of new C++ program file (code.cpp)" name
    case $name in 
        * ) name="code.cpp";;
    esac
    if [ -e $name ]; then
        echo "File name $name already exists!"
        echo "Please provide a different filename"
    else 
        echo >> $name
        created=1
    fi
done

cat Skeleton > $name        # there's an error in this line, dont know what is wrong here

这不是家庭作业。我只是想自动创建一个新文件。这不仅仅是一个 C++ 文件创建(以防有人告诉我只使用 ide)。

我希望能够通过脚本生成时间戳并填写 URL。如果有人能提供帮助,我将不胜感激。谢谢

编辑:我在接受的答案中添加了以下两行:

  local curr_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
  subl "$curr_dir/$prog_name"

现在我正在使用 sublime text,所以这可行。但如果我的电脑没有安装 sublime text,我是否可以对脚本进行这样的更改,如果没有安装,它会打开 gedit 或其他程序,而不仅仅是给出错误?

答案1

检查下面的脚本。我建议使用catheredoc 结构来写出大段文本并替换变量。此外,将代码分解为函数 - 这将更易于阅读且更易于调试。

这里已经提到了一些技术方面。我使用 heredoc 结构来cat写出标题和正文。tee命令用于将信息写出到 stdout 和文件。这样,您可以在命令行上看到,如果出现任何问题,您不必打开文件 - 只需删除它并创建一个新文件。至于现有文件名,这只是一个 while 循环,它会不断困扰用户,直到他们真正输入不存在的名称。

脚本

#!/bin/bash

make_header()
{
    timestamp=$(date)
    echo "/*"
    cat << EOF
 * URL:
 * Author: $1
 * Timestamp: $timestamp
EOF
echo " */"
}

make_body()
{
    cat << EOF

#include <iostream>
#include <algorithm>
#include <vector> 

using namespace std;

int main(int argc, char* argv[]) {
    // code
}

EOF
}

check_name_exists()
{

    while [ -e "$prog_name" ];
    do
        echo ">>> $prog_name: file exists, please choose different name:"
        read prog_name
    done
}

main()
{
    local prog_name=""
    local author
    local default_name="my_prog.cpp"

    echo "Enter author name:"
    read author
    echo "Enter program name:"
    read prog_name
    if [ "x$prog_name" == "x"  ];then
        prog_name="$default_name"
    fi

    check_name_exists

    header=$(make_header "$author")
    body=$(make_body)
    echo "$header" "$body" | tee "$prog_name"

}
main

演示:

$ ./skeleton.sh                                                                                                                  
Enter author name:
John Doe
Enter program name:
code.cpp
>>> code.cpp: file exists, please choose different name:
code.cpp
>>> code.cpp: file exists, please choose different name:
code1.cpp
/*
 * URL:
 * Author: John Doe
 * Timestamp: 2016年 11月 06日 星期日 12:42:01 MST
 */ 
#include <iostream>
#include <algorithm>
#include <vector> 

using namespace std;

int main(int argc, char* argv[]) {
    // code
}

相关内容