Deseja escrever um script bash para automatizar a criação de arquivos de programa [closed]

1

Eu quero escrever um script bash que possa:

  1. crie um arquivo com um nome específico inserido pelo usuário. Se o usuário não inserir um nome, deverá fornecer um nome padrão, mas também verificar se esse nome está presente.
  2. Permitir que mais algumas variáveis sejam inseridas pelo usuário que podem ser usadas para preencher esse arquivo de programa, incluindo o preenchimento da seção de comentários (para coisas como author_name)

Eu não tenho muita experiência em escrever scripts de bash então por favor forneça pequenos exemplos de código. Muito obrigado!

PS: Eu acho que isso é muito parecido com o script npm init que cria o arquivo package.json . Eu não consigo encontrar esse script, por isso, se é de código aberto, por favor, forneça um link se você o tiver.

Eu escrevi isso até agora:

Esqueleto:

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

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

using namespace std;

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

Skeleton.sh

#!/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

Este não é um dever de casa. Eu estou apenas tentando automatizar a criação de um novo arquivo. Não vai ser apenas uma criação de arquivo C ++ (no caso de alguém me dizer para usar apenas um ide).

Gostaria de poder preencher o registro de data e hora gerando-o por meio do script e também poder preencher o URL usando o script. Se alguém puder fornecer ajuda, isso será apreciado. Obrigado

EDITAR: Eu adicionei essas duas linhas na resposta aceita:

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

Agora estou usando texto sublime, então isso funciona. Mas se eu estiver em um computador que não possui texto sublime instalado, posso fazer essas alterações no script que, se não estiver, abrirá o gedit ou outra coisa em vez de apenas dar um erro?

    
por Kapil Gupta 06.11.2016 / 17:14

1 resposta

2

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
}
    
por Sergiy Kolodyazhnyy 06.11.2016 / 20:46