А защо не пробваш нещо от рода: c=$[$a-$b] вместо c=`echo $a+$b|bc` Поне при мен работи и с много големи числа примерно: а=12345678901234567890;b=12345678801234567880;export a b echo $[$a-$b] 100000000010
Martin Kolev wrote:
On Thu, Feb 03, 2005 at 11:45:01AM +0200, Martin Kolev wrote:
Здравейте,
Опитвам се с помощта на bash да срваня две променливи, но уви нешо ми убягва. Ето и скрипта който се опитвам да накарам да заработи:
#!/bin/bash
a=2390347223 b=455455
c=`echo $a+$b|bc`
Това може да бъде подобрено по няколко начина :)
Ако си сигурен, че този скрипт ще бъде изпълняван винаги от bash, и си силно против идеята да пишеш portable shell scripts, можеш да направиш c=$(($a + $b)) с двойни скоби. Всъщност е много вероятно това да работи и на повечето реализации на ksh, добрият стар Korn shell, но има много реализации на /bin/sh, при които няма да върви... so don't do that.
Правилният начин да правиш изчисления в shell scripts е с изполване на expr(1):
c = `expr "$a" + "$b"`
...като тук интервалите между операндите са важни.
if [ $c -gt $b ];
Тук от гледна точка на стил и изграждане на навици можеш да слагаш кавички около променливите, макар че точно в този случай не е съвсем задължително. Всъщност... задължително е, защото стойността на 'c' е получена от външната програма expr, която може и да не е /bin/expr, или по някакъв друг начин да е била излъгана да извади нещо друго... Та, да, аз бих го написал това като if [ "$c" -gt "$b" ];
then echo "c e po-goliamo ot b" else echo "c e po-malko ot b" fi
Проблема е, че резултата е вингаи по-малкия. Може ли някои по опитен от мен да ми отговори?
Това вече е странно. Можеш ли да пробваш следното:
#!/bin/bash
echo "Proba s 'bc'"
a=2390347223 b=455455
c=`echo $a+$b|bc` echo "a is $a, b is $b, c is $c"
if [ "$c" -gt "$b" ]; then echo "c e po-goliamo ot b" else echo "c e po-malko ot b" fi
echo "Proba s 'expr'"
a=2390347223 b=455455
c=`expr "$a" + "$b"` echo "a is $a, b is $b, c is $c"
if [ "$c" -gt "$b" ]; then echo "c e po-goliamo ot b" else echo "c e po-malko ot b" fi
Ето резултата от скрипта, който ме помолихте да тествам:
Proba s 'bc' a is 2390347223, b is 455455, c is 2390802678 ./math: [: 2390802678: integer expression expected c e po-malko ot b Proba s 'expr' a is 2390347223, b is 455455, c is -1904164618 c e po-malko ot b
Ето и версията на дистрибуцията: Debian Woody Linux backup 2.4.19 #17 SMP Wed Sep 18 21:42:45 EEST 2002 i686 unknown
П.С. Искам да подчертя, че съм тествал програмката с expr, let, bc, както и по този начин: c=$(($a + $b)), но резултата си остава "c e po-malko ot b". Също така, опитах в условието да направя сравнението ето така: if [ "$c" \> "$b" ];
Поздрави, Мартин Колев
============================================================================ A mail-list of Linux Users Group - Bulgaria (bulgarian linuxers). http://www.linux-bulgaria.org - Hosted by Internet Group Ltd. - Stara Zagora To unsubscribe: http://www.linux-bulgaria.org/public/mail_list.html ============================================================================
============================================================================ A mail-list of Linux Users Group - Bulgaria (bulgarian linuxers). http://www.linux-bulgaria.org - Hosted by Internet Group Ltd. - Stara Zagora To unsubscribe: http://www.linux-bulgaria.org/public/mail_list.html ============================================================================