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
。