Saya dapat membaca angka dan operasinya dengan:
echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op
tapi kemudian semua upaya saya untuk menambahkan angka gagal:
case "$op" in
"+")
echo num1+num2;;
"-")
echo `num1-num2`;;
esac
Lari:
First number please
1
Second mumber please
2
Operation?
+
Keluaran:
num1+num2
...atau...
echo $num1+$num2;;
# results in: 1+2
...atau...
echo `$num1`+`$num2`;;
# results in: ...line 9: 1: command not found
Sepertinya saya mendapatkan string masih mungkin ketika saya mencoba menambahkan add ("2 + 2" bukannya "4").
case
atau apa pun kecuali satu baris:,echo $num+$num
karena itu akan mereproduksi masalah dengan tepat . Gagasan dengan meminimalkan konteks dalam pertanyaan pemrograman dijelaskan di sini: sscce.orgJawaban:
Aritmatika dalam kulit POSIX dilakukan dengan
$
dan tanda kurung ganda(( ))
:Anda dapat menetapkan dari itu
echo
:Ada juga
expr
:Dalam skrip
$(())
lebih disukai karena menghindari garpu / eksekusi untukexpr
perintah.sumber
echo $(($num1$op$num2))
tanpa melibatkancase
.case
terlibat di sini.+
, jadi perlu bagiancase
luar untuk menangani pengurangan secara terpisah.case
dari kode OP denganecho $(($num1$op$num2))
- yang akan berfungsi, tetapi menggunakancase
lebih kuat karena Anda dapat menangani kesalahan dengan default*
.Jawaban yang ada adalah bash murni, jadi akan lebih cepat dari ini, tetapi hanya bisa menangani bilangan bulat. Jika Anda perlu menangani pelampung, Anda harus menggunakan program eksternal
bc
.Ia
scale=4
memintabc
agar menggunakan empat tempat desimal. Lihatman bc
untuk informasi lebih lanjut.sumber
bash
tidak mendukung floating point aritmatika dengan$((...))
, banyak kerang (ksh93
,zsh
,yash
setidaknya) lakukan. Keuntungannyabc
adalah ia mendukung presisi sembarang sementara aritmatika shell terbatas pada jenis prosesordouble
. Perhatikan bahwa Anda tidak perlu mengatur discale
sini. Untuk tambahan,scale
parameter tidak digunakan. Skala3.1415+9.99
akan diturunkan dari operan (di sini 4).450
dan yang lainnya adalah desimal disimpan pada variabel$mynumber
? Sebagai contoh450-$mynumber
,.echo "450-$mynumber" | bc
harus melakukannya. Jika Anda ingin variabel berkembang, Anda harus menggunakan tanda kutip ganda daripada tanda kutip tunggal.computedval=$(echo 'scale=10;var1-var2' | bc)
tidak bekerja, juga tidakcomputedval=$(echo 'scale=10;$var1-$var2' | bc)
Perhatikan
\
sebelum*
(untuk perkalian), seluruh ekspresi harus berada dalam tanda kutip `.sumber
expr
tidak perlu, dan tidak pernah perlu untuk menangkap output standar dari sebuah perintah hanya untuk menuliskannya kembali ke output standar.minimalis
sumber
Anda juga dapat menggunakan
$[ ... ]
struktur. Dalam hal ini, kami menggunakan mechanizm bawaan di Bash, yang lebih cepat dan sedikit lebih nyaman digunakan. Karena kita tahu bahwa segala sesuatu di antara $ [, dan] diperlakukan sebagai ekspresi, kita tidak perlu mendahului variabel dengan$
. Demikian pula, kita tidak perlu merasa aman*
dari memperlakukannya seperti sebuah pola.sumber
Berdasarkan urutan input yang Anda minta dari pengguna, tampaknya Anda menggunakan notasi polish terbalik.
Anda dapat melakukannya lebih baik hanya dengan menggunakan
dc
(kalkulator meja) secara langsung, karena memang itulah tujuannya.Sesi contoh menggunakan
dc
:Atau, non-interaktif:
sumber