这到底有什么区别?只是加法前后位置调换,就报错?为什么?

sh/bash/dash/ksh/zsh等Shell脚本
回复
kidkey
帖子: 28
注册时间: 2017-09-21 14:46
系统: ubuntu16.04

这到底有什么区别?只是加法前后位置调换,就报错?为什么?

#1

帖子 kidkey » 2018-05-01 12:22

环境:CentOS release 6.9 (Final) 2.6.32-696.10.1.el6.x86_64
bash:GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)

需求是统计niginx的access.log的总流量
脚本1正常

代码: 全选

sum=0
while read line
        do
                SIZE=`echo $line|awk '{print $10}'|egrep -v "^\""`
                expr $SIZE + 1 &>/dev/null
                [ $? -eq 0 ]&&{
                #echo $SIZE
                sum=$(($SIZE+$sum))
                }
        done<./access.log
echo $sum
脚本2就不行

代码: 全选

sum=0
while read line
        do
                SIZE=`echo $line|awk '{print $10}'|egrep -v "^\""`
                expr $SIZE + 1 &>/dev/null
                [ $? -eq 0 ]&&{
                #echo $SIZE
                sum=$(($sum+$SIZE))
                }
        done<./access.log
echo $sum
这两个脚本的区别就是sum=$(($sum+$SIZE)) sum=$(($SIZE+$sum)) 两个变量谁在前 谁在后

调试脚本2时 卡在这个地方

代码: 全选

+ read line
++ egrep -v '^"'
++ awk '{print $10}'
++ echo 1.12.77.113 - - '[18/Apr/2018:10:22:50' '+0800]' '"GET' / 'HTTP/1.1"' 200 57700 '"http://39.105.19.97/?page_id=10"' '"Mozilla/5.0' '(Windows' NT '10.0;' 'Win64;' 'x64)' AppleWebKit/537.36 '(KHTML,' like 'Gecko)' Chrome/65.0.3325.181 'Safari/537.36"'
+ SIZE=57700
+ expr 57700 + 1
+ '[' 0 -eq 0 ']'
+ sum=31596953
+ read line
++ egrep -v '^"'
++ awk '{print $10}'
++ echo 1.12.77.113 - - '[18/Apr/2018:10:27:28' '+0800]' '"x03"' 400 174 '"-"' '"-"'
+ SIZE=
+ expr + 1
+ '[' 0 -eq 0 ']'
access.sh: line 8: 31596953+: syntax error: operand expected (error token is "+")
[root@bbs logs]# 
附带日志 脑袋很疼
附件
access.txt
(702.44 KiB) 已下载 111 次
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 这到底有什么区别?只是加法前后位置调换,就报错?为什么?

#2

帖子 lilydjwg » 2018-05-01 14:41

数学表达式里边的变量名不要加 $。
建议脚本写好之后使用 shellcheck 检查一下。
kidkey
帖子: 28
注册时间: 2017-09-21 14:46
系统: ubuntu16.04

Re: 这到底有什么区别?只是加法前后位置调换,就报错?为什么?

#3

帖子 kidkey » 2018-05-01 16:44

lilydjwg 写了:数学表达式里边的变量名不要加 $。
建议脚本写好之后使用 shellcheck 检查一下。
:em11
kidkey
帖子: 28
注册时间: 2017-09-21 14:46
系统: ubuntu16.04

Re: 这到底有什么区别?只是加法前后位置调换,就报错?为什么?

#4

帖子 kidkey » 2018-05-01 19:57

这神器好是好 就是有点太严谨了 :em06
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 这到底有什么区别?只是加法前后位置调换,就报错?为什么?

#5

帖子 lilydjwg » 2018-05-01 20:06

kidkey 写了:这神器好是好 就是有点太严谨了 :em06
习惯了就好 :-)
回复