Script Error sob Dash

0

Por que o seguinte script está me dando um erro usando Dash (sh) e o mesmo está funcionando usando o Bash?

Não consigo ver o erro

Obrigado pela sua ajuda.

#!/bin/bash

# Calculate the length of the hypotenuse of a Pythagorean triangle
# using hypotenuse^2 = adjacent^2 + opposite^2

echo -n "Enter the Adjacent length: "
read adjacent

echo -n "Enter the Opposite length: "
read opposite

asquared=$(($adjacent ** 2))        # get a^2
osquared=$(($opposite ** 2))        # get o^2

hsquared=$(($osquared + $asquared)) # h^2 = a^2 + o^2

hypotenuse='echo "scale=3;sqrt ($hsquared)"  | bc'  # bc does sqrt

echo "The Hypotenuse is $hypotenuse"

O resultado:

myname@myhost:~$ sh ./hypotenusa.sh

Enter the Adjacent length: 12

Enter the Opposite length: 4

./hypotenusa.sh: 12: ./hypotenusa.sh: arithmetic expression: expecting primary: "12 ** 2"


myname@myhost:~$ bash ./hypotenusa.sh

Enter the Adjacent length: 12

Enter the Opposite length: 4

The Hypotenuse is 12.649

Minha versão do Ubuntu é 13.04.

    
por LEO 12.09.2013 / 18:38

2 respostas

1

A resposta é simplesmente que dash não suporta exponenciação através do operador ** (não é um requisito para um interpretador de shell compatível com POSIX).

Você pode verificar se um determinado script usa esses 'bashisms' usando o utilitário checkbashisms , por exemplo

$ cat > myscript.sh
#!/bin/sh

echo $((12 ** 2))

Ctrl + d

$ checkbashisms myscript.sh
possible bashism in myscript.sh line 3 (exponentiation is not POSIX):
echo $((12 ** 2))
$ 
    
por steeldriver 12.09.2013 / 19:12
0

O operador ** não é reconhecido por sh. sh (Shell Command Language) é uma linguagem de programação descrita pelo padrão POSIX , enquanto o bash altera o comportamento de scripts de shell POSIX válidos, portanto, por si só bash não é um shell POSIX válido. O operador de exponenciação ** foi introduzido no bash uma vez com a versão 2.02.

Fontes:

No bash e no sh ^ é o operador padrão para aumentar um número para outro (consulte man bc ). Então, seu script deve gostar:

#!/bin/bash

# Calculate the length of the hypotenuse of a Pythagorean triangle
# using hypotenuse^2 = adjacent^2 + opposite^2

echo -n "Enter the Adjacent length: "
read adjacent

echo -n "Enter the Opposite length: "
read opposite

asquared="($adjacent ^ 2)"        # get a^2
osquared="($opposite ^ 2)"        # get o^2

hsquared="($osquared + $asquared)" # h^2 = a^2 + o^2

hypotenuse='echo "scale=3;sqrt ($hsquared)"  | bc'  # bc does sqrt

echo "The Hypotenuse is $hypotenuse"
    
por Radu Rădeanu 12.09.2013 / 19:15