Examine o script abaixo. Eu recomendo usar cat
com a estrutura heredoc para escrever grandes blocos de texto com a substituição de variáveis. Além disso, divida o código em funções - será muito mais legível e mais fácil de depurar.
Alguns dos aspectos técnicos já foram mencionados aqui. Estou usando a estrutura heredoc com cat
para escrever cabeçalho e corpo. O comando tee
é usado para gravar as informações no stdout e no arquivo. Dessa forma, você pode ver na linha de comando que, se algo deu errado, você não precisa abrir o arquivo - basta excluí-lo e criar um novo. Quanto ao nome de arquivo existente, isso é simplesmente um loop while que mantém o bug do usuário até que ele realmente digite o nome que não existe.
Script
#!/bin/bash
make_header()
{
timestamp=$(date)
echo "/*"
cat << EOF
* URL:
* Author:
* 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
Demo:
$ ./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
}