我想编写一个 bash 脚本,它可以:
- 创建一个由用户输入特定名称的文件。如果用户未输入名称,则应提供默认名称,但同时检查该名称是否存在。
- 允许用户输入更多变量,用于填充该程序文件,包括填充注释部分(例如 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
检查下面的脚本。我建议使用cat
heredoc 结构来写出大段文本并替换变量。此外,将代码分解为函数 - 这将更易于阅读且更易于调试。
这里已经提到了一些技术方面。我使用 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
}