简单的 shell 脚本中出现错误(即 +:意外的“表达式结束”)?

简单的 shell 脚本中出现错误(即 +:意外的“表达式结束”)?
find_totalusage()
{
    local totalusedsize=0
    for dirname in $dirnamelist
    do
        dirsize=$(find_dir_size "$dirname")
        totalusedsize=$(( $totalusedsize + $dirsize ))
    done
    echo $totalusedsize
}

size=$(find_totalusage)

有人能帮我找出错误吗?

答案1

我认为最可能的解释是你的dirsize变量是空的。

例如,在bash

$ foo=3; bar= ; echo $(( $foo + $bar ))
bash: 3 +  : syntax error: operand expected (error token is "+  ")

在 AT&T 工作期间ksh

$ foo=3; bar= ; echo $(( $foo + $bar ))
ksh:  3 +  : more tokens expected

在 BSD 中mksh

$ foo=3; bar= ; echo $(( $foo + $bar ))
mksh:  3 +  : unexpected 'end of expression'

请注意,所有这些 shell 都允许像(( foo + bar ))表达式中一样使用“裸”变量名,并且这种形式可能更可取,因为它将空变量视为零值。来自man bash

   Shell variables are allowed as operands; parameter  expansion  is  per‐
   formed before the expression is evaluated.  Within an expression, shell
   variables may also be referenced by name without  using  the  parameter
   expansion  syntax.  A shell variable that is null or unset evaluates to
   0 when referenced by name without using the parameter expansion syntax.

例如

$ foo=3; bar=7 ; echo $(( foo + bar ))                                         
10

$ foo=3; bar= ; echo $(( foo + bar ))                                          
3

答案2

man bash该命令记录for为:

for name [ [ in [ word ... ] ] ; ] do list ; done

man ksh说:

for name [in word ...]; do list; done

在这两种情况下,都需要一个分号 ( ;) 来标记包含 中的单词的表达式的结束$dirlist

相关内容