Текст, не проходящий через аргументы командной строки в сценарии оболочки во FreeBSD

#shell #unix #freebsd

#оболочка #unix #freebsd

Вопрос:

В моей основной функции сценария оболочки вызывается функция

send_report "{1}" "{2}"

Функция send_report имеет функцию send_mail, которая выглядит как

 Send_Mail "${sub}" "${recip}" "`cat MSG_TEXT.txt`" 
  

Теперь функция send_mail имеет 3 передаваемых аргумента, третьим аргументом является тело, которое здесь является содержимым MSG_TEXT.txt который содержит правильный контент, который я проверил.

 if test "$3X" = "X"
 then {
echo "$NAME- `date`" >> ${rootpath}Mail_MSG.txt
}
else {
cat $3 >> ${rootpath}Mail_MSG.txt
}
fi

mail -s "`cat ${rootpath}Mail_MSG.txt`" $MAILTO  
  

Я получаю письмо, но в теле приходит значение

 "$NAME- `date`"
  

что означает, что текст аргумента $ 3 не прочитан и удовлетворяет первому условию If . Итак, я хотел знать, неправильно ли я передаю аргументы командной строки при вызовах этих функций??

примечание — Запуск FreeBSD

Комментарии:

1. Несколько вещей… cat $3 вероятно, ошибка, ожидающая возникновения, когда $3 содержит что-либо, кроме имени файла, которое доступно. "{1}" и "{2}" являются буквальными строками, содержащими именно эти символы, поэтому, если это действительно то, на что send_report похож ваш вызов, это, вероятно, неправильно. Вместо if test "$3X" = "X" этого попробуйте if [ -z "$3" ] проверить наличие пустой строки.

2. @twalberg хорошо, поэтому я уберу двойные кавычки {1} и {2} в send_report … Я также буду использовать -z флаг на $3 … но что меня здесь смущает MSG_TEXT.txt , так это то, что в нем есть содержимое, поэтому, когда я использую его из Send_Mail функции, почему он отображает имя и дату в теле письма, а не содержимое MSG_TEXT.txt …. не выполняется ли условие If?

3. Я не думаю, что здесь достаточно, чтобы понять, что происходит. Попробуйте поместить set -x что-нибудь в начале вашего сценария, тогда вы сможете отслеживать каждую команду по мере ее выполнения и проверять, все ли работает так, как вы ожидаете.

4. хорошо, сделаю это и дам вам знать, спасибо

5. Во FreeBSD рекомендуется использовать /bin/sh для сценариев оболочки, поскольку он является частью базовой системы FreeBSD. Оболочка Korn ( ksh ) — это порт, который может быть недоступен. Примеры сценариев оболочки см., например /etc/rc.subr .