find_totalusage()
{
local totalusedsize=0
for dirname in $dirnamelist
do
dirsize=$(find_dir_size "$dirname")
totalusedsize=$(( $totalusedsize + $dirsize ))
done
echo $totalusedsize
}
size=$(find_totalusage)
Кто-нибудь поможет мне найти ошибку?
Я думаю, что наиболее вероятным объяснением является то, что ваша переменная 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'
Обратите внимание, что все эти оболочки допускают использование «голых» имен переменных, таких как (( 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
man bash
документирует команду for
следующим образом:
for name [ [ in [ word ... ] ] ; ] do list ; done
man ksh
говорит:
for name [in word ...]; do list; done
В обоих случаях вам нужна точка с запятой (;
) отметить конец выражения, содержащего слова в $dirlist
.