Bir argümanı aritmetik işlem yapmak için bir tam sayıya nasıl dönüştüreceğinizi bulmaya çalışın ve şunu yazdırın addOne.sh:
echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
Bir argümanı aritmetik işlem yapmak için bir tam sayıya nasıl dönüştüreceğinizi bulmaya çalışın ve şunu yazdırın addOne.sh:
echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
Yanıtlar:
Bash'te "aritmetik işlem yapmak için bir argümanı bir tam sayıya dönüştürmez". Bash'te, değişkenler bağlama göre tamsayı veya dizge olarak değerlendirilir.
Aritmetik gerçekleştirmek için, aritmetik genişleme operatörünü çağırmalısınız $((...)). Örneğin:
$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3
veya genellikle tercih edilir:
$ echo "$((a + 1))"
3
Bash'ın (ksh93, zsh veya yash'ın aksine) yalnızca tamsayı aritmetiği yaptığını bilmelisiniz . Kayan nokta numaralarınız (ondalık sayılar) varsa, yardımcı olacak başka araçlar da vardır. Örneğin, bcşunları kullanın :
$ b=3.14
$ echo "$(($b + 1))"
bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1")
$ echo "$b + 1" | bc -l
4.14
Veya bash yerine kayan nokta aritmetik destekli bir kabuk kullanabilirsiniz:
zsh> echo $((3.14 + 1))
4.14
Olarak bash, kullanmakta Tamsayıya şey dönüştürme yapabilirsiniz Printf -v :
printf -v int '%d\n' "$1" 2>/dev/null
Kayan sayı tam sayıya dönüştürülürken, herhangi bir sayı sayı gibi görünmüyor, sayı 0'a dönüştürülüyor. e
Örnek:
$ printf -v int '%d\n' 123.123 2>/dev/null
$ printf '%d\n' "$int"
123
$ printf -v int '%d\n' abc 2>/dev/null
$ printf '%d\n' "$int"
0
$ printf -v int '%d\n' 1e10 2>/dev/null
$ printf '%d\n' "$int"
1
printf -vkomut değişikliği ile elde edilebilir:int="$(printf '%d' 123.123 2>/dev/null)"
bashkullandın?
Son zamanlarda benzer bir durum, hem Linux hem de OSX ortamlarında çalışacak bash scriptleri geliştirirken ortaya çıktı. OSX'teki bir komutun sonucu, sonuç kodunu içeren bir dize döndürdü; yani " 0",. Tabii ki, bu aşağıdaki durumda doğru bir şekilde test edemedi:
if [[ $targetCnt != 0 ]]; then...
Çözüm, sonucu @ John1024'ün yanıtladığı gibi bir tamsayıya zorlamak (yani 'dönüştürmek') ve beklendiği gibi çalışmasını sağlamaktı:
targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
==Vb de [[(ayrıca [aka test) dize karşılaştırma yapmak. Aritmetik karşılaştırma için farklı operatörler vardır [[ $targetcnt -ne 0 ]]; Koşullu İfadeler altındaki manpage'e (veya info) bakınız. Boşlukları özel olarak kesmek için, varsayılan sözcük ayırma (içinde yapılmamıştır ) elde etmek için genellikle [değişken olmayan genişlemeyle kullanabilirsiniz , ancak genel olarak bu yaklaşım sizi tehlikeye sokar. [ $targetcnt == 0 ][[
renk kodlarına dikkat edin, izlemeyecek olsalar bile ( -x) görünmeyecekler, onu ne verecekti ki, bir sayı olması gereken dizginin nasıl yazdırırsanız yazsın tırnaklara sarılmış olması.
$((var+var))bile başarısız olacağı belirsiz olabilir. Gerçi siz echoveya printfher ikisi de değişiyorsa, aynı. Çıktının kaynağında renk kodlarını devre dışı bırakarak sadece onu düzeltebildiğim için düzeltmeyi bilmiyorum. İzleme günlüklerinde tespit etmek için, var='0'olması gerektiği gibi atanmış rahatsız edici değişkeni göreceksinizvar=0
sedbunu devre dışı olamazsa
printf "1 + %s\n" $1 won't do ?