Умножение в сценарии оболочки при отправке почты с использованием 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.