Ошибка в простом сценарии оболочки (например, +: неожиданный конец выражения)?

find_totalusage()
{
    local totalusedsize=0
    for dirname in $dirnamelist
    do
        dirsize=$(find_dir_size "$dirname")
        totalusedsize=$(( $totalusedsize + $dirsize ))
    done
    echo $totalusedsize
}

size=$(find_totalusage)

Кто-нибудь поможет мне найти ошибку?

0
задан 19 January 2018 в 21:09

2 ответа

Я думаю, что наиболее вероятным объяснением является то, что ваша переменная 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
1
ответ дан 19 January 2018 в 21:09

man bash документирует команду for следующим образом:

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

man ksh говорит:

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

В обоих случаях вам нужна точка с запятой (;) отметить конец выражения, содержащего слова в $dirlist.

-1
ответ дан 19 January 2018 в 21:09

Другие вопросы по тегам:

Похожие вопросы: