Como posso fazer meu script bash abrir cat para entrada e, em seguida, salvar a entrada em uma variável no script

4

Estou tentando criar um simples script de e-mail para que outros usuários possam me enviar um e-mail do terminal.

O script está sendo feito em parte como uma experiência de aprendizado, e porque os outros usuários não são muito versados em linux, então eu quero que eles possam facilmente enviar e-mail a partir do terminal, sem ter que aprender os programas e sintaxe. / p>

Eu tenho o ubuntu 16.04.1 Server

Até agora, é com isso que estou trabalhando:

clear
echo -e "Please Enter Subject of email:\n "
read subject

echo -e "\n\nFrom: $USER\nTo: Adminstrator\nSubject: $subject\n\nEnter body of email: \n "
read body
echo -e "\nYour message is as follows:\n"
echo -e "\nFrom: $USER\nTo: Administrator\nSubject: $subject\n\n"
echo -e "$body \n\n"

read -p "Send to Administrator (y/n)?" choice
case "$choice" in
  y|Y ) echo "$body" | mail -s "$subject" [email protected];;
  n|N ) echo "Roger Dodger. Email canceled";;
    * ) echo "invalid";;
esac

Coisas que você pode fazer:

  • entrada de solicitação para assunto e corpo

  • envia dados para suas respectivas variáveis.

  • ligue para essas variáveis e envie o e-mail.

Coisas que eu quero que seja capaz de fazer:

  • Permitir pressionar Enter para ir para uma nova linha

  • Permitir backspace

Já estive em todos os lugares duas vezes, e presumo que estou perdendo alguma coisa ou falta algum conhecimento fundamental sobre como posso incorporar esses recursos. Eu tentei usar leitura com delimitadores, gato com delimitadores, enquanto loops (o que quer que seja) Eu tenho variável de configuração, aliases. Eu li páginas man link link Eu tentei canalizá-lo e substituindo com $ () eu tentei enviar a entrada para um arquivo e chamar esse arquivo.

Estou ficando sem ideias.

Eu não consegui fazer com que o terminal fornecesse uma seção para digitar ao usar o cat, mas consegui que o prompt fosse lido.

Estou a pensar que quero semelhante a

cat >> SEND && echo | ${BODY) 

e, em seguida, onde o script pede, apenas forneça a variável $ {BODY}.

Em um terminal sozinho, eu corri com sucesso:

cat << SEND && echo | ${BODY} && echo "${BODY}"

que me permitiu digitar várias linhas, até que eu digitei SEND, e colei a variável $ {BODY} na qual a saída estava correta.

Qualquer ideia é apreciada.

    
por Stevener78 27.09.2016 / 09:37

1 resposta

2

Eu não acho que o que você está pedindo é possível. Ao usar read , você só tem acesso a capacidades mínimas de edição de texto, simplesmente não é projetado para o que você deseja fazer. Mesmo se você puder encontrar uma maneira de permitir backspace e novas linhas, ainda é uma maneira muito complicada de solicitar que seus usuários forneçam informações. É muito raro esperar que seus usuários digitem texto diretamente no programa em execução. Sugiro uma alternativa:

  1. Peça ao seu script para ler o assunto na linha de comando.
  2. Ele leu o corpo de um arquivo de entrada.

Dessa forma, seu usuário não precisa digitar tudo manualmente, seu script pode ser automatizado para enviar vários e-mails, aumentando muito sua utilidade e seus usuários não precisam começar tudo de novo do zero se fizerem um erro de digitação . Finalmente, eles podem formatar o corpo do email como desejarem. Então, por exemplo, você pode fazer algo assim:

#!/bin/bash
## Parse command line options. 
while getopts ":s:f:" opt; do
  case $opt in
            s)
                subject="$OPTARG"
                ;;
            f)
                file="$OPTARG"
                ## Exit if the file isn't a file or isn't readble               
                if [[ ! -r "$file" && ! -f "$file" ]]; then
                    echo "File doesn't exist or isn't readble"
                        exit
                fi
                ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2;;
  esac
done
## Read the email body
body=$(cat "$file")

## Inform the user. The "3[1m" starts bold formatting and the
## "3[0m" ends it. Remove them if you don't want bold. 
echo -e "3[1mYour message is as follows:3[0m"
cat<<EoF

From: $USER
To: Administrator
Subject: $subject

$body

------------------
EoF

read -p "Send to Administrator (y/n)?" choice
case "$choice" in
  y|Y ) echo "$body" | mail -s "$subject" [email protected];;
  n|N ) echo "Roger Dodger. Email canceled";;
    * ) echo "invalid";;
esac

Em seguida, você indica o assunto e um arquivo de entrada. Por exemplo, se você tiver um arquivo chamado message com o seguinte conteúdo:

$ cat message 
Dear John,

I hope this email finds you well. I am writing to inquire about the
price of the bridge you are selling. I would love to have a bridge
like that in my garden since I think it would make my cows look
larger.

Looking forward to hearing from you,

best,

Jack. 

Você executaria o script assim:

$ foo.sh -s "about that bridge..." -f message 
Your message is as follows:

From: terdon
To: Administrator
Subject: about that bridge...

Dear John,

I hope this email finds you well. I am writing to inquire about the
price of the bridge you are selling. I would love to have a bridge
like that in my garden since I think it would make my cows look
larger.

Looking forward to hearing from you,

best,

Jack. 

------------------
Send to Administrator (y/n)?

Como alternativa, se você insistir em que os usuários gravem a mensagem na hora, você poderá usar o editor padrão disponível em seu sistema:

#!/bin/bash

clear
echo -e "Please Enter Subject of email:\n "
read subject

## create a temp file
tmpfile=$(mktemp)

cat<<EoF

Press Enter to open an editor where you can write the body of the email.
When finished, save and exit.
EoF
read

## Open the editor
"$EDITOR" "$tmpfile"

## Read the body and delete the tmp file
body=$(cat "$tmpfile")
rm "$tmpfile"
## Inform the user. The "3[1m" starts bold formatting and the
## "3[0m" ends it. Remove them if you don't want bold. 
echo -e "3[1mYour message is as follows:3[0m"
cat<<EoF

From: $USER
To: Administrator
Subject: $subject

$body
EoF

read -p "Send to Administrator (y/n)?" choice
case "$choice" in
  y|Y ) echo "$body" | mail -s "$subject" [email protected];;
  n|N ) echo "Roger Dodger. Email canceled";;
    * ) echo "invalid";;
esac

Finalmente, se você insistir em tornar sua vida e a de seus usuários mais difícil do que precisa, você pode usar cat > $tmpfile para gravar o corpo no tmpfile, dizer aos seus usuários para pressionar Ctrl + D quando terminarem de escrever:

#!/bin/bash

clear
echo -e "Please Enter Subject of email:\n "
read subject

## create a temp file
tmpfile=$(mktemp)
## Enter the body
printf '\nPlease enter the body of the email below. Hit Ctrl+D when done.\n\n'
cat > $tmpfile
body=$(cat "$tmpfile")
rm "$tmpfile"
## Inform the user. The "3[1m" starts bold formatting and the
## "3[0m" ends it. Remove them if you don't want bold. 
echo -e "3[1mYour message is as follows:3[0m"
cat<<EoF

From: $USER
To: Administrator
Subject: $subject

$body
EoF

read -p "Send to Administrator (y/n)?" choice
case "$choice" in
  y|Y ) echo "$body" | mail -s "$subject" [email protected];;
  n|N ) echo "Roger Dodger. Email canceled";;
    * ) echo "invalid";;
esac
    
por terdon 27.09.2016 / 10:54

Tags