Умножение в сценарии оболочки при отправке почты с помощью mailx

StackOverflow https://stackoverflow.com//questions/12682837

  •  12-12-2019
  •  | 
  •  

Вопрос

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}')))

Существуют также разные способы использования выражение команда или позволять команда.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top