Kabuğumda aşağıdaki gibi komutları çalıştırdığımda expr: non-integer argument
hata veriyor . Lütfen birisi bunu bana açıklayabilir mi?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Kabuğumda aşağıdaki gibi komutları çalıştırdığımda expr: non-integer argument
hata veriyor . Lütfen birisi bunu bana açıklayabilir mi?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Yanıtlar:
Bu değişkenler kabuk değişkenleridir. Bunları başka bir programa ( ör. expr
) Parametre olarak genişletmek için $
önekini kullanmanız gerekir :
expr $x / $y
Şikayet etmesinin nedeni, alfabetik karakterler ( yani tamsayı olmayan) üzerinde çalışmayı düşündüğünüzdür.
Bash kabuğunu kullanıyorsanız, ifade sözdizimini kullanarak aynı sonucu elde edebilirsiniz:
echo $((x / y))
Veya:
z=$((x / y))
echo $z
man bash
istemine yazın ( q
çıkmak için)
Zaten diğer konularda bahsedildiğine inanıyorum:
calc(){ awk "BEGIN { print "$*" }"; }
o zaman şunu yazabilirsiniz:
calc 7.5/3.2
2.34375
Sizin durumunuzda:
x=20; y=3;
calc $x/$y
veya isterseniz, bunu ayrı bir komut dosyası olarak ekleyin ve $ PATH içinde kullanılabilir hale getirin, böylece her zaman yerel kabuğunuza sahip olursunuz:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
Neden kullanmıyorsunuz; Çok daha kolay buluyorum. Yararlı bulabileceğiniz bir örnek:
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
Başka bir basit örnek - 1970'den bu yana geçen gün sayısını hesaplayın:
let days=$(date +%s)/86400
Çoğu Linux dağıtımında varsayılan kabuk Bash'tır. Bash'te, değişkenlerin parametre genişletme için bir dolar işareti öneki kullanması gerekir . Örneğin:
x=20
y=5
expr $x / $y
Tabii ki, Bash ayrıca aritmetik işleçlere ve özel bir aritmetik genişletme sözdizimine sahiptir , bu nedenle ifade ikili dosyasını ayrı bir işlem olarak çağırmaya gerek yoktur . Kabuğun tüm işi böyle yapmasına izin verebilirsiniz:
x=20; y=5
echo $((x / y))
expr
2013 yılında önerilmez
Varsayalım
x=50
y=5
sonra
z=$((x/y))
bu düzgün çalışır. Ancak / operatörünü durum bildirimlerinde kullanmak istemiyorsanız çözümleyemez. Bu durumda div veya devide gibi basit dizeler veya başka bir şey kullanın. Kodu görün
/
mermi kovanı etiketi olarak iyi çalışır. İşe yaramayan şey, *
alıntı yapmadan çarpmak için kullanmaktır , ki aslında yaptığınız şey bu olabilir; bu da, örneğinizde 'devide' ve 'modulo' olan aşağıdaki tüm öğeleri etkili bir şekilde geçersiz kılmasına neden olur
Ondalık noktadan sonra sayı almak için şunları yapabilirsiniz: -
read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div