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 上記の構文では、常に 3 行目でエラーが発生します (Mismatch Percentage) on * sign. 。3行目の乗算処理で何か間違っているのでしょうか?

アップデート:-

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

expr コマンドまたは let コマンドを使用するさまざまな方法もあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top