Ainda outro erro de sintaxe próximo ao token inesperado '(' [closed]

0

Este diferente dos outros como:

  1. Estou invocando o bash (não sh) no shebang: #! /bin/bash
  2. estou executando com ./
  3. As permissões de arquivo estão corretas: 755

A linha em questão é:

 formattedTIME='awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds'

O conteúdo de $domPATH/duration.seconds é 37603

Eu posso rodar isso na linha de comando:

formattedTIME='awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' duration.seconds'

e obtenha o resultado de Duration: 10h 26m quando eu echo $formattedTIME

Mas executá-lo nos resultados do script:

./time.sh: line 42: syntax error near unexpected token '('
./time.sh: line 42: '    formattedTIME='awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds''

Informação extra: Isso é em um Raspberry Pi 2 executando Jessie.

UPDATE: o erro foi on-line 8:

echo 'Cc: [email protected],[email protected],[email protected],[email protected]'' >> $domPATH/arrive.email
    
por Jim 14.11.2016 / 11:59

1 resposta

2

Algumas tendências comuns sobre o motivo pelo qual um comando não é analisado adequadamente em um script, mas funciona bem quando é executado por conta própria:

A origem do erro está em outro lugar

O shell reportará um erro na primeira coisa que não espera. Aqui, ele não espera um ( , mas parece que está dentro de uma string entre aspas. Uma possível explicação é que você não está em uma string citada porque o primeiro ' realmente fecha uma citação anterior não fechada em vez de abrir um novo '...' em like em:

echo It's a bug
formattedTIME='awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds

Isso é realmente:

echo It'quoted-string'{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}'...

E esse ( sem aspas acima é inesperado no shell.

Você tem problemas semelhantes com qualquer estrutura que não esteja adequadamente fechada ou no formato incorreto, como fi sem then ...

Backticks

Backticks não devem ser usados. $(...) deve ser usado em seu lugar.

Dentro de backticks, \ é tratado de forma diferente.

echo "'
  echo It\\'s OK
'"

não está bem. Mesmo que echo It\\'s OK por si só esteja OK, como dentro dos backticks, as duas primeiras barras invertidas se tornam uma, então ela acaba sendo echo It\'OK .

A forma moderna $(...) não tem esses problemas.

Aliases

aliases são um pouco parecidos com macros, sua expansão passa por interpretação de código novamente.

Coisas como:

alias foo="echo '"
...
foo bar
echo 'baz('

teria o problema oculto na definição do foo alias.

Existem mais sutis como:

alias foo='a;b'
cmd | foo

Que, sem causar erros de sintaxe, faz com que a análise seja feita de maneira inesperada.

Geralmente, as funções são mais apropriadas que os aliases

localização

Algumas sequências de bytes podem ser interpretadas de forma diferente, dependendo da localidade.

Por exemplo, o byte 0xa0 é o espaço sem quebra no conjunto de caracteres ISO-8859-1. E esse caractere é um espaço em branco no Solaris e bash trata todos os espaços em branco como delimitadores (atualmente apenas para caracteres de byte único).

Esse 0xa0 byte também faz parte de vários caracteres UTF-8, como à . Então você pode achar que, por exemplo, um script que tenha:

var=àdo

(com que à escrito em UTF-8) pára de funcionar quando executado no Solaris em uma localidade ISO-8859-1, porque isso se torna var=X do (onde X é o primeiro byte desse à personagem).

Ou você pode descobrir que:

echo ε

Com isso, ε escrito no conjunto de caracteres BIG5-HKSCS pára de funcionar quando você não está na zh_HK.big5hkscs locale, pois ε é realmente codificado como 0xa3 0x60, onde 0x60 em ASCII e todos conjuntos de caracteres de bytes é o caractere de backtick.

    
por 14.11.2016 / 13:17