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
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
- Relacionado: unix.stackexchange.com/questions/40786/…
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)