【问题标题】:Multiplication in shell script while sending mail using mailx使用mailx发送邮件时shell脚本中的乘法
【发布时间】:2012-10-02 00:10:38
【问题描述】:
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。有什么想法为什么会发生?

【问题讨论】:

  • 反引号语法在反引号之间运行命令行,并将整个部分替换为命令的输出。您收到错误是因为100*((... 不是命令。 $((...)) 用于算术运算,$(...) 是使用反引号的替代方法,这在您有多个嵌套命令时很有用,例如在您的情况下。

标签: bash shell mailx


【解决方案1】:

适合我:

所以问题可能是很多事情,例如实际上没有使用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

【讨论】:

    【解决方案2】:

    对小数部分使用预定义变量可以避免冗长的命令行和混乱。

    事实上,使用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
    

    括号的位置首先进行除法(在乘法之前截断)似乎有问题,但这就是你上面所说的。通过使用变量,更容易发现这样的点。

    【讨论】:

    • 我已经更新了代码,但它仍然在同一行给我一个错误。
    【解决方案3】:

    假设这是 bash shell,您可以使用类似的表达式

    $((100 * 4))
    

    获得算术表达式的评估。将“4”替换为您提供的更大的表达式。

    【讨论】:

    • 我提到的 100 不在 $(()) 部分中。
    • 较大的表达式也是不正确的。即$(echo ...) vs (echo ...)
    【解决方案4】:

    请试试这个:

    $((100 * $(echo $QUERY_TEN_DAYS3 | awk '{print $2}') / $(echo $QUERY_TEN_DAYS3 | awk '{print $1}')))
    

    expr 命令或 let 命令的使用方式也不同。

    【讨论】:

    • 我已经更新了代码,但它仍然在同一行给我一个错误。
    • 它对我有用。我的环境:GNU bash,版本 3.2.25。你用的是哪个外壳?
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2011-09-11
    • 2010-12-19
    • 2011-07-06
    • 2010-12-21
    • 1970-01-01
    • 2014-10-13
    • 2014-05-27
    相关资源
    最近更新 更多