2016-06-03 4 views
1

Я новичок в программировании оболочки. У меня есть два файла:Как заменить значение владельца места

  1. eg.txt
  2. file.sh

Файл eg.txt имеет некоторое содержание HTML и file.sh cotains сценарий оболочки. В сценарии значение присваивается переменной temp, и это значение должно быть введено в файл HTML.

eg.txt

<html> 
    Hi MGM ,<br/> 
    One alert has been received !!<br/> 

Here is the event Data.<br/><br/> 

<font size=‘1’>{temp}</font> 
<br/><br/> 
Regards, 
WDTS Supports. 
</html> 

file.sh

echo $1 
temp=56 

(
echo "To:"$1 
echo "Subject: Alert Updates !! " 
echo "Content-Type: text/html" 

echo cat eg.txt 
) | /usr/sbin/sendmail -t 

echo "Mail sent !!" 
+0

Помните, что '!' Имеет особые значения в bash. Установите флажок [\ [this \]] (http://serverfault.com/questions/208265/what-is-bash-event-not-found). – sjsam

ответ

1
echo $1 
temp=56 

    (
    echo "To:"$1 
    echo "Subject: Alert Updates !! " 
    echo "Content-Type: text/html" 

    awk -F "" -v var=$temp '{gsub(/{temp}/,var,$0); print}' < eg.txt 
) | /usr/sbin/sendmail -t 

echo "Mail sent !!" 

добавил AWK к '|' где температура сохраняется в переменной AWK: вар, который впоследствии был заменен

awk -F "" -v var=$temp '{gsub(/{temp}/,var,$0); print}' 
+0

Извините, брок, его не работает –

+0

что вы получаете? – Chet

+2

Остерегайтесь: [UUoC] (https://stackoverflow.com/questions/11710552/useless-use-of-cat/) - Бесполезное использование 'cat'. –

3

С СЕПГ:

sed "s/{temp}/$temp/" eg.txt | /usr/sbin/sendmail -t 

Вы также можете использовать printf вводить переменные в шаблоне:

file.sh

temp=56 
tpl=$(cat "eg.txt") 

printf "$tpl" "$1" "$temp" | /usr/sbin/sendmail -t 

eg.txt

To:%s 
Subject: Alert Updates !! 
Content-Type: text/html 

<html> 
    Hi MGM ,<br/> 
    One alert has been received !!<br/> 

Here is the event Data.<br/><br/> 

<font size=‘1’>%s</font> 
<br/><br/> 
Regards, 
WDTS Supports. 
</html> 

Обновление:

В случае нескольких переменных, просто написать несколько команд (и замещающих обновления заполнители в eg.txt):

sed "s/{temp1}/$temp1/;s/{temp2}/$temp2/" eg.txt | /usr/sbin/sendmail -t 
+0

Не вредите добавлению 'g' с sed, я думаю, но зачем беспокоиться? ;) – sjsam

+0

Я работаю над этой командой, но электронные письма будут спамить. Может ли кто-нибудь сказать мне, как с этим бороться. Он должен появиться в моем почтовом ящике –

+0

Попробуйте удалить '!!' from Subject в eg.txt – SLePort

2

у меня есть ввел некоторую проверку ошибок на ваш код:

#!/bin/bash 
temp=56 
if [ -z "$1" ] 
then 
echo "Usage : ./file.sh user_name_to_mail to" 
exit -1 
else 
    if id "$1" >/dev/null 2>&1 #Check if user exists, suppress stdout, stderr 
    then 
     mail_header=$(echo -e "To: $1\nSubject: Alert Updates"'!!'"\nContent-Type: text/html\n") 
     mail_body=$(awk -v var="$temp" '{print gensub(/{temp}/,var,"g"$0)}' eg.txt) 
     echo -e "$mail_header\n$mail_body" | sendmail -t     
    else 
     echo -e "Sorry! Invalid User\n" 
     exit -1 # The error code is set to detect failure 
    fi 
fi 

Чтобы предотвратить распространение спама, вам необходимо иметь действительную запись SPF для домена, из которого вы отправляете электронное письмо. Проверьте начальную точку [ this ].


Примечание:

! специальный символ колотить, он используется для обозначения предыдущей команды. Чтобы обойти эту проблему, я использовал ..Updates"'!!'"\nContent-Type...

В одинарных кавычках ! теряет свое особое значение.


Интересно гласит:

  1. Что такое [ SPF ] запись?
  2. Открытый SPF [ documentation ].
+0

Вы можете упростить: 'if id" $ 1 ">/dev/null 2> & 1; then' – andlrc

+0

@andlrc: Я согласен, но я хотел сделать это более подробно здесь. – sjsam

+0

Я не согласен, если честно, я не вижу, как это может быть более явным, чем: 'if this_thing; затем'. Обертывание в командных подстановках означает, что OP знаком с '$?'. И даже если это так, практика по-прежнему преподает. – andlrc

Смежные вопросы