Ketika saya menjalankan perintah di shell saya seperti di bawah ini, itu mengembalikan expr: non-integer argument
kesalahan. Bisakah seseorang menjelaskan hal ini kepada saya?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Ketika saya menjalankan perintah di shell saya seperti di bawah ini, itu mengembalikan expr: non-integer argument
kesalahan. Bisakah seseorang menjelaskan hal ini kepada saya?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Jawaban:
Variabel tersebut adalah variabel shell. Untuk mengembangkannya sebagai parameter ke program lain ( yaitu expr
), Anda perlu menggunakan $
awalan:
expr $x / $y
Alasan yang dikeluhkan adalah karena Anda mengira Anda mencoba menggunakan karakter alfabetis ( yaitu non-integer)
Jika Anda menggunakan Bash shell, Anda dapat memperoleh hasil yang sama menggunakan sintaks ekspresi:
echo $((x / y))
Atau:
z=$((x / y))
echo $z
man bash
pada prompt ( q
untuk keluar)
Saya yakin itu sudah disebutkan di utas lain:
calc(){ awk "BEGIN { print "$*" }"; }
maka Anda cukup mengetik:
calc 7.5/3.2
2.34375
Dalam kasus Anda, ini akan menjadi:
x=20; y=3;
calc $x/$y
atau jika Anda lebih suka, tambahkan ini sebagai skrip terpisah dan buat tersedia di $ PATH sehingga Anda akan selalu memilikinya di shell lokal Anda:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
Mengapa tidak menggunakan let; Saya merasa jauh lebih mudah. Berikut adalah contoh yang mungkin berguna bagi Anda:
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
Contoh sederhana lainnya - hitung jumlah hari sejak 1970:
let days=$(date +%s)/86400
Shell default di sebagian besar distribusi Linux adalah Bash. Di Bash, variabel harus menggunakan awalan tanda dolar untuk perluasan parameter . Sebagai contoh:
x=20
y=5
expr $x / $y
Tentu saja, Bash juga memiliki operator aritmatika dan sintaks ekspansi aritmatika khusus , jadi tidak perlu memanggil biner expr sebagai proses terpisah. Anda dapat membiarkan shell melakukan semua pekerjaan seperti ini:
x=20; y=5
echo $((x / y))
expr
tidak disarankan pada tahun 2013.
Untuk mendapatkan angka setelah koma desimal, Anda dapat melakukan ini: -
read num1 num2
div=`echo $num1 / $num2 | bc -l`
echo $div
/
berfungsi dengan baik sebagai label shell-case. Apa yang tidak berhasil adalah menggunakan *
perkalian tanpa mengutipnya, yang mungkin memang seperti yang Anda lakukan; yang menyebabkannya secara efektif menimpa semua item berikut dalam kasus ini, yang dalam contoh Anda adalah 'devide' dan 'modulo'