Умножение в сценарии оболочки при отправке почты с использованием 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, Есть мысли, почему это происходит?

4 ответа

Решение

Работает для меня:

Таким образом, проблема может заключаться в любом количестве вещей, таких как неиспользование 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

Использование предопределенных переменных для дробных частей может избежать длинных командных строк и путаницы.

Infact, делая 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}')))

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

Другие вопросы по тегам