Quando eseguo i comandi nella mia shell come di seguito, restituisce un expr: non-integer argument
errore. Qualcuno può spiegarmelo?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Quando eseguo i comandi nella mia shell come di seguito, restituisce un expr: non-integer argument
errore. Qualcuno può spiegarmelo?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Risposte:
Quelle variabili sono variabili di shell. Per espanderli come parametri in un altro programma ( es. expr
), È necessario utilizzare il $
prefisso:
expr $x / $y
Il motivo per cui si è lamentato è perché pensava che stessi cercando di operare su caratteri alfabetici ( cioè non interi)
Se stai usando la shell Bash, puoi ottenere lo stesso risultato usando la sintassi delle espressioni:
echo $((x / y))
O:
z=$((x / y))
echo $z
man bash
al prompt ( q
per uscire)
Credo che sia già stato menzionato in altri thread:
calc(){ awk "BEGIN { print "$*" }"; }
quindi puoi semplicemente digitare:
calc 7.5/3.2
2.34375
Nel tuo caso sarà:
x=20; y=3;
calc $x/$y
o se preferisci, aggiungilo come script separato e rendilo disponibile in $ PATH in modo da averlo sempre nella tua shell locale:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
Perché non usare let; Lo trovo molto più semplice. Ecco un esempio che potresti trovare utile:
start=`date +%s`
# ... do something that takes a while ...
sleep 71
end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds
Un altro semplice esempio: calcolare il numero di giorni dal 1970:
let days=$(date +%s)/86400
La shell predefinita sulla maggior parte delle distribuzioni Linux è Bash. In Bash, le variabili devono utilizzare un prefisso del simbolo del dollaro per l' espansione dei parametri . Per esempio:
x=20
y=5
expr $x / $y
Naturalmente, Bash ha anche operatori aritmetici e una speciale sintassi di espansione aritmetica , quindi non è necessario invocare il file binario expr come processo separato. Puoi lasciare che la shell faccia tutto il lavoro in questo modo:
x=20; y=5
echo $((x / y))
expr
è scoraggiato nel 2013.
supponiamo
x=50
y=5
poi
z=$((x/y))
questo funzionerà correttamente. Ma se vuoi usare / operator in case case di quante non riesca a risolverlo. In quel caso usa stringhe semplici come div o devide o qualcos'altro. Vedi il codice
/
funziona bene come un'etichetta shell-case. Ciò che non funziona è usare *
per moltiplicare senza citarlo, che potrebbe essere quello che hai effettivamente fatto; che lo fa scavalcare efficacemente tutti gli elementi seguenti nel caso, che nel tuo esempio è 'devide' e 'modulo'
Per ottenere i numeri dopo il punto decimale, è possibile eseguire questa operazione: -
read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div