Erro no shell script simples (ou seja, +: 'fim de expressão' inesperado)?

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

size=$(find_totalusage)

Alguém me ajuda a encontrar o erro?

    
por Kumarasamy Palanisamy 19.01.2018 / 18:00

2 respostas

1

Acho que a explicação mais provável é que sua variável dirsize está vazia.

Por exemplo, em bash

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

enquanto estiver em AT & T ksh

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

e no BSD mksh

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

Observe que todos esses shells permitem nomes de variáveis "simples", como (( foo + bar )) em expressões, e essa forma pode ser preferível, pois trata as variáveis vazias como valores zero. De 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.

Então, por exemplo

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

$ foo=3; bar= ; echo $(( foo + bar ))                                          
3
    
por steeldriver 20.01.2018 / 00:28
-1

man bash documenta o comando for como:

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

man ksh diz:

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

Em ambos os casos, você precisa de um ponto-e-vírgula ( ; ) para marcar o final da expressão contendo as palavras em $dirlist .

    
por waltinator 19.01.2018 / 18:36