Умножение в сценарии оболочки при отправке почты с помощью mailx
Вопрос
mailx -s "Report for $DATE_TENDAYS_FORMAT1" -r uname@host.com uname@host.com <<EOF
Total Items Purchased as per EDW: `echo $QUERY_TEN_DAYS3 | awk '{print $1}'`
Total Items Missing or Mismatch : `echo $QUERY_TEN_DAYS3 | awk '{print $2}'`
Mismatch Percentage: `100*((echo $QUERY_TEN_DAYS3 | awk '{print $2}')/(echo $QUERY_TEN_DAYS3 | awk '{print $1}'))`
EOF
Всякий раз, когда я пытаюсь отправить электронное письмо с помощью mailx
с приведенным выше синтаксисом я всегда получаю ошибку в третьей строке (Mismatch Percentage) on * sign
.Что-то не так я делаю в процессе умножения в третьей строке?
Обновлять:-
TEST1=`echo $QUERY_TEN_DAYS3 | awk '{print $1}'`
echo $TEST1
TEST2=`echo $QUERY_TEN_DAYS3 | awk '{print $2}'`
echo $TEST2
mailx -s "Report for $DATE_TENDAYS_FORMAT1" -r uname@host.com uname@host.com <<EOF
Comparison using previous day’s data
******************************************
Mismatch Percentage: $((100 * ($TEST2/ $TEST1)))
EOF
Я попробовал приведенный выше код, но он все равно выдает ошибку в первой строке, поскольку ( unexpected
.Есть мысли, почему это происходит?
Решение
Работает для меня:
Таким образом, проблема может заключаться в чем угодно, например в неиспользовании bash
(или его недавнюю версию), не выполняется то, что вы здесь разместили, неправильный ввод, проблемы с символом EOL в вашем файле сценария.
$ echo $BASH_VERSION
3.00.15(1)-release
$ QUERY_TEN_DAYS3="1 2"
$ TEST1=`echo $QUERY_TEN_DAYS3 | awk '{print $1}'`
$ echo $TEST1
1
$ TEST2=`echo $QUERY_TEN_DAYS3 | awk '{print $2}'`
$ echo $TEST2
2
$ cat <<EOF
> Comparison using previous day’s data
>
> ******************************************
>
> Mismatch Percentage: $((100 * ($TEST2/ $TEST1)))
>
> EOF
Comparison using previous day’s data
******************************************
Mismatch Percentage: 200
Другие советы
Использование предопределенных переменных для дробных частей позволяет избежать длинных командных строк и путаницы.
Фактически, делая echo
+ awk
извлечение частей кажется излишним.В зависимости от других аспектов вашего модуля, возможно, лучше сначала поместить их в отдельные переменные, а не в $QUERY_TEN_DAYS3
.
Теперь, предположим, что мы застряли с $QUERY_TEN_DAYS3
, и это значение, разделенное пробелами, в форме "DIVISOR DIVIDEND ..."
, другой способ разбить его так:
read -r FOO BAR JUNK <<<"$QUERY_TEN_DAYS3"
Тогда мы получаем:
mailx -s "Report for $DATE_TENDAYS_FORMAT1" -r uname@host.com uname@host.com <<EOF
Total Items Purchased as per EDW: $FOO
Total Items Missing or Mismatch : $BAR
Mismatch Percentage: $((100 * ($BAR / $FOO)))
EOF
Расположение круглых скобок для первого деления (усечения перед умножением) кажется сомнительным, но это то, что у вас было выше.Используя переменные, гораздо легче обнаружить такие точки.
Предполагая, что это оболочка bash, вы можете использовать выражение типа
$((100 * 4))
чтобы получить оценку арифметического выражения.Замените «4» на большее выражение, которое вы предоставили.
Пожалуйста, попробуйте это:
$((100 * $(echo $QUERY_TEN_DAYS3 | awk '{print $2}') / $(echo $QUERY_TEN_DAYS3 | awk '{print $1}')))
Существуют также разные способы использования выражение команда или позволять команда.