Adicionando dois números usando expr

13

Estou aprendendo scripts da Shell para obter um diploma em TI que estou fazendo atualmente. Estou tentando escrever um pequeno script que adiciona dois números, como mostra um dos tutoriais que recebemos.

echo "Enter two numbers"
read num1 num2
sum = 'expr $num1 + $num2'
echo "The sum is = $sum"

No entanto, quando eu concedo a permissão de execução e executo o script, isso me dá esse erro.

sum: =. No such file or directory.
sum: expr $num1 + $num2: No such file or directory

insira a descrição da imagem aqui

Eu tentei executar isso no Ubuntu e no Fedora, mas o mesmo erro ocorre. Alguém pode me dizer o que estou perdendo aqui?

Isuru
fonte

Respostas:

39

Primeiro você precisa se livrar dos espaços para a tarefa, por exemplo

sum='expr $num1 + $num2'

você precisa mudar 'para um `ou ainda melhor para $():

sum=$(expr "$num1" + "$num2")

Em vez de usar, exprvocê também pode fazer o cálculo diretamente no seu shell:

sum=$((num1 + num2))
Ulrich Dangel
fonte
3
Se a motivação para usar em exprvez de $((...))desejar ser portátil para o shell Bourne clássico, é uma boa ideia também evitar isso $(...).
Alan Curry
2
@AlanCurry existem conchas que não suportam $()? Tanto quanto eu sei que é exigido pelo posix, por exemplo, todos os shells compatíveis com o posix devem suportar #$()
1100 Ulrich Dangel
1
@UlrichDangel O shell Bourne original não tinha $(…), mas acabou (talvez alguém em algum lugar ainda esteja executando o /bin/shSolaris).
Gilles 'SO- stop be evil' em
O C Shell não suporta $(…)–– ou pelo menos nem todas as versões.
Scott
Qual é o objetivo de ter aspas duplas em torno das variáveis?
precisa saber é o seguinte
9

Você provavelmente leu os backticks como aspas simples na linha:

sum = 'expr $num1 + $num2'

Veja o Wiki de Greg sobre como usar $(...).

Isso funciona conforme o esperado:

sum=$(expr "$num1" + "$num2")

Observe também que não há lacunas em torno do sinal de igual (a atribuição de variável).

jasonwryan
fonte
1

expré um programa externo usado pelo Bourne shell (ie sh). O shell Bourne não tinha originalmente nenhum mecanismo para executar aritmética simples. Ele usa exprprograma externo com a ajuda de backtick.

O backtick ( ` ) é chamado de substituição de comando. Substituição de comando é o mecanismo pelo qual o shell executa um determinado conjunto de comandos e, em seguida, substitui sua saída no lugar dos comandos.

sum=`expr $num1 + $num2`

No bash (bourne again shell) ele tem o seguinte systax, não usará programa extrnal expr.

sum=$((num1+num2))

se queremos usar o programa externo expr. nós temos o seguinte systax:

sum=$(expr $num1 + $num2)
Premraj
fonte
0

Se você estiver usando o bash, basta fazer algo assim:

sum=$((num1+num2))
Hopping Bunny
fonte
-1
#!/bin/bash
function add()
{
sum=`expr $a + $b`
echo "Sum is :$sum";
}

echo "Enter the value of a";
read a
echo "Enter the valure of b";
read b
add
Imtiyaz
fonte
adicione também algumas descrições sobre o código e como isso ajudará a resolver a questão?
Tejas
-1

echo "enter first no :"; read a
echo "enter second no :"; read b
echo "sum = `expr $a + $b`"
pandu raju
fonte
-2

Você pode usar um único bastão (a `tecla)

sahare prashant
fonte
1
É um bastão, e é recomendável usar $( ... )nas conchas. Além disso, o problema é que o OP usa espaços onde não deveria.
vonbrand
-2
echo a 
read a
echo b
read b
c=`expr $a + $b`
echo $c
prasanna
fonte
-3
echo "addition of two number"

echo "enter a number"
read a
echo "enter a number"
read b

c=`expr $a + $b`

echo $c
kishan
fonte
3
Isso não está respondendo à pergunta. Alguma explicação ajudaria.
Bernhard