Combinando dois scripts bash e usando um menu

0

Eu tenho dois scripts, um que é usado em uma pasta com arquivos csv e outro em uma pasta com arquivos .tar.gz. No segundo script, primeiro descompacte os arquivos antes de fazer qualquer coisa com eles. Agora eu quero combinar os dois scripts em um script onde um usuário pode especificar com qual pasta ele quer trabalhar. Quando o script é executado, o usuário tem duas opções, para usar o folderA ou o folderB. Mais ou menos como um menu.

ScriptA

#!/bin/bash
FOLDER=/path/to/folder
DATE_LOG='date "+%Y-%m-%d-%H:%M:%S"'
LOG_FILE=/home/kamil/Desktop/Script/log_$DATE_LOG.txt


# Getting the pattern and headers of files from FOLDER
cd "$FOLDER"
    for file in *.csv; do
    echo -n "${file}" "|" | sed -r 's/(.*)_[0-9]{8}_[0-9][0-9]-[0-9][0-9].[0-9][0-9].csv//'
        head -1 "$file"
    done | tee $LOG_FILE

ScriptB

#!/bin/bash
FOLDER_HISTO=/path/to/folder/WithTAR.GZ
DATE_LOG='date "+%Y-%m-%d-%H:%M:%S"'
LOG_FILE=/home/kamil/Desktop/Script/log_$DATE_LOG.txt


# Getting the pattern and headers of files from FOLDER_HISTO
cd "$FOLDER_HISTO"
    for zip_file in *.tar.gz; do
    file='tar -xvf $zip_file'
    echo -n "${file}" "|" | sed -r 's/(.*)_[0-9]{8}_[0-9][0-9]-[0-9][0-9].[0-9][0-9].csv//'
        head -1 "$file"
    done | tee $LOG_FILE 
    
por pathy 30.12.2014 / 22:17

2 respostas

1

Suponho que a maneira padrão da CLI de criar um menu é select :

select response in "Folder 1" "Folder 2"
do
    case $response in
        "Folder 1") cd folder1; /path/to/ScriptA.sh; exit ;;
        "Folder 2") cd folder2; /path/to/ScriptB.sh; exit ;;
    esac
done
    
por 30.12.2014 / 23:01
1

Os scripts são tão semelhantes que eu os combinaria em um script. Isso levaria dois argumentos: uma opção -tar ou -csv para indicar como os arquivos devem ser expandidos e um nome de diretório para onde cd .

MODE=$1
FOLDER=$2
DATE_LOG='date "+%Y-%m-%d-%H:%M:%S"'
LOG_FILE=/home/kamil/Desktop/Script/log_$DATE_LOG.txt

case "$mode" in 
    -tar) SUFFIX=tar.gz
          CMD="tar -xvf" 
        ;;
    -csv) SUFFIX=csv
          CMD="cat" 
        ;;
    *) echo Invalid mode "$mode" >&2; exit 1 ;;
esac

if ! cd "$FOLDER"
then echo "Bad folder $FOLDER" >&2
     exit 1
fi
for file in *.SUFFIX; do
    contents='$CMD $file'
    echo -n "$contents" "|" | sed -r 's/(.*)_[0-9]{8}_[0-9][0-9]-[0-9][0-9].[0-9][0-9].csv//'
    head -1 "$contents"
done | tee $LOG_FILE

As coisas que você está fazendo no loop for não parecem corretas, suspeito que sejam mais erros de cópia. Espero que você consiga descobrir como encaixar o que você está fazendo na estrutura acima. A idéia geral é encontrar todos os locais onde os dois scripts diferem e colocá-los em variáveis que são definidas na instrução case . Você pode não conseguir fazer tudo com substituições simples de variáveis como eu fiz - você pode precisar de uma instrução if também.

Isso é chamado de princípio DRY .

Se as pastas forem sempre as mesmas, dependendo do modo, você poderá colocar a atribuição FOLDER na instrução case , em vez de exigi-la na linha de comando. Você também pode substituir a opção da linha de comando por um menu como na resposta do muru.

    
por 30.12.2014 / 23:13