Estou aprendendo Shell scripting para um diploma em TI que estou fazendo no momento. Estou tentando escrever um pequeno script que adiciona dois números, conforme mostrado em 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 dou o permissão de execução e executar o script, ele me dá este erro.

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

insira a descrição da imagem aqui

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

Comentários

Resposta

Primeiro, você deve eliminar os espaços para a tarefa, por exemplo,

sum="expr $num1 + $num2" 

então você deve alterar " para um ` ou ainda melhor para $():

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

em vez de usar expr você também pode fazer o cálculo ulation diretamente em seu shell:

sum=$((num1 + num2)) 

Comentários

  • Se a motivação para usar expr em vez de $((...)) é um desejo de ser portátil para o shell Bourne clássico, então ' é uma boa ideia para evitar $(...) também.
  • @AlanCurry existem shells que não suportam $()? Tanto quanto eu sei, é exigido por posix, por ex. todos os shells compatíveis com posix devem oferecer suporte a $()
  • @UlrichDangel O shell Bourne original não ' tinha $(…), mas está quase extinto (talvez alguém em algum lugar ainda esteja executando o /bin/sh no Solaris).
  • O C Shell não t suporte $(…) –– ou, pelo menos, não todas as versões.
  • Qual é o propósito de colocar aspas duplas nas variáveis?

Resposta

Você provavelmente interpretou mal as crases como aspas simples na linha:

sum = "expr $num1 + $num2"

Consulte o Wiki de Greg “ sobre como usar o $(...).

Isto 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 da variável).

Resposta

expr é um programa externo usado por Bourne shell (ou seja, sh). O shell Bourne originalmente não tinha nenhum mecanismo para realizar aritmética simples. Ele usa expr um programa externo com a ajuda de crase.

A crase ( `) é realmente 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` 

Em bash (bourne again shell) tem o seguinte sistema, não vai usar o programa extrnal expr.

sum=$((num1+num2)) 

se quisermos usar o programa externo expr. temos a seguinte sistemática:

sum=$(expr $num1 + $num2) 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *