Автор Тема: Bash:  помощ за действие оператор  (Прочетена 4155 пъти)

kid

  • Напреднали
  • *****
  • Публикации: 22
    • Профил
Здравейте, от съвсем скоро се "захласнах" по писане на скриптове na BASH и имам 2 проблема който не мога да реша.
1-вият е за сибиране на дробни числа, пример:
$atrack=134.243935
$vtrack=562.207763
echo "scale=1;$atrack + $vtrack" | bc)
така написан ми дава резултат -> 696.451698 макар , че съм задал един знак след десетичната запетая.
Ако променя дейсвието на "/" няма проблем:
echo "scale=1; 562.207763 / 134.243935" | bc
резултат -> 4.1
echo "scale=2; 562.207763 / 134.243935" | bc
резултат -> 4.18

Пробвах и по този начин:
echo "$((134,243935 + 562,207763))"
но тогава резултата е -> 207763  
Въпроса ми е, как при сбор на дробни числа резултата да е закръглен до цяло число (примерно 696 в случайя) или дробно но с един знак след десетичната запетая (примерно 696.4).

2-рият ми въпрос е за дейсвие "/" при което резултата е по-малък от 0
Примерни имам число(стойност) 9 кето искам да раздяля на 10
ето какво правя:
echo "scale=1; 9 / 10" | bc
но вместо резултата да е 0.9 излиза .9
ако пък го напиша така:
echo "$((9 / 10))"
резултата е 0
Въпроса ми е как трабва да се напише за да ми излизат резултатите както си му е реда... 0.1 , 0.2 , 0.3.... и т.н.
Благодаря предварително.

П.П.
Ако е възможно и с обяснение, все пак целта е да се разбере. А не някой да ти го "изсипе" на готова и следващия път...  '<img'>
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Bash:  помощ за действие оператор
« Отговор #1 -: Aug 25, 2007, 19:26 »
по първия въпрос:

Примерен код

echo "scale=1; ($a + $b)/1" | bc

'<img'>

по втория - нямам идея '<img'>
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Nikolavp

  • Напреднали
  • *****
  • Публикации: 408
    • Профил
    • WWW
Bash:  помощ за действие оператор
« Отговор #2 -: Aug 25, 2007, 20:16 »
Цитат (VladSun @ Авг. 25 2007,20:26)
по първия въпрос:

Примерен код

echo "scale=1; ($a + $b)/1" | bc

'<img'>

по втория - нямам идея '<img'>

<offtopic>
Много хитро измислен. Определно ми хареса.
</offtopic>
По - добре използвай нещо по - портативно за скриптове, като например python(perl?) '<img'>.



Активен

http://blog-nikolavp.rhcloud.com - простотиите, с които се занимавам в свободното време

kid

  • Напреднали
  • *****
  • Публикации: 22
    • Профил
Bash:  помощ за действие оператор
« Отговор #3 -: Aug 25, 2007, 22:55 »
Цитат (VladSun @ Авг. 25 2007,20:26)
по първия въпрос:

Примерен код

echo "scale=1; ($a + $b)/1" | bc

'<img'>

по втория - нямам идея '<img'>

Благодаря...
Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Bash:  помощ за действие оператор
« Отговор #4 -: Aug 26, 2007, 12:04 »
Цитат (kid @ Авг. 25 2007,19:03)
2-рият ми въпрос е за дейсвие "/" при което резултата е по-малък от 0
Примерни имам число(стойност) 9 кето искам да раздяля на 10
ето какво правя:
echo "scale=1; 9 / 10" | bc
но вместо резултата да е 0.9 излиза .9
ако пък го напиша така:
echo "$((9 / 10))"
резултата е 0
Въпроса ми е как трабва да се напише за да ми излизат резултатите както си му е реда... 0.1 , 0.2 , 0.3.... и т.н.
Благодаря предварително.

Примерен код
bash 3.2.13(1) $ printf "%0.1f\n" $(echo "9/10"|bc -l)
0.9


zsh:
Примерен код
zsh 4.3.4 % printf "%0.1f\n" $((9./10))
0.9




Активен

kid

  • Напреднали
  • *****
  • Публикации: 22
    • Профил
Bash:  помощ за действие оператор
« Отговор #5 -: Aug 26, 2007, 13:35 »
Нещо не става при мен...:huh:
[kid@xxl-44e57356ff1 ~]$ printf "%0.1f\n" $(echo "9/10"|bc -l)
bash: printf: .90000000000000000000: invalid number
0,0
[kid@xxl-44e57356ff1 ~]$
Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Bash:  помощ за действие оператор
« Отговор #6 -: Aug 26, 2007, 14:12 »
Цитат (kid @ Авг. 26 2007,14:35)
Нещо не става при мен...:huh:
[kid@xxl-44e57356ff1 ~]$ printf "%0.1f\n" $(echo "9/10"|bc -l)
bash: printf: .90000000000000000000: invalid number
0,0
[kid@xxl-44e57356ff1 ~]$

Taka:

Примерен код
(LC_ALL=C;printf "%0.1f\n" $(echo "9/10"|bc -l))


Може би, така ще е по-бързо (по идея на Chris F.A. Johnson, с изменения):

Примерен код
bash 3.2.13(1) $ calc () { awk 'BEGIN{printf "%.1f\n",'"$1"';exit}'; }
 bash 3.2.13(1) $ calc 9/10
0.9




Активен

kid

  • Напреднали
  • *****
  • Публикации: 22
    • Профил
Bash:  помощ за действие оператор
« Отговор #7 -: Aug 26, 2007, 17:23 »
Благодаря за отделеното време, стана...



Активен

sandman_7920

  • Напреднали
  • *****
  • Публикации: 44
    • Профил
Bash:  помощ за действие оператор
« Отговор #8 -: Aug 27, 2007, 14:53 »
Проблема ти е главно в това, че не подаваш правилно scale на bc-то
Трябва да ползваш "echo -e" това ти дава право на expression в баш общо-взето да можеш да му кажеш къде да има enter

a=`echo -e "scale=2\n9/10"|bc`
echo $a

Това ти дава .90 до втория знак.
За форматиране на стринга можеш да ползваш printf, кофтито тук, е че printf(man printf) ползва за десетичен знак ',' а bc връща '.' за това:
a=`echo -e "scale=5\n 562.207763 / 134.243935" | bc`
a=`echo $a|replace . ,` - това сменя '.' с ','
printf "%.2f" $a
Тук е важно да се отбележи, че printf прави закръгляне, а не режи стринг-а като scale на bc
Активен

kid

  • Напреднали
  • *****
  • Публикации: 22
    • Профил
Bash:  помощ за действие оператор
« Отговор #9 -: Aug 27, 2007, 15:32 »
Също много полезна за мен информация, благодаря много sandman_7920.



Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Bash:  помощ за действие оператор
« Отговор #10 -: Aug 27, 2007, 16:23 »
Цитат (sandman_7920 @ Авг. 27 2007,15:53)

Проблема ти е главно в това, че не подаваш правилно scale на bc-то
Трябва да ползваш "echo -e" това ти дава право на expression в баш общо-взето да можеш да му кажеш къде да има enter

a=`echo -e "scale=2\n9/10"|bc`
echo $a

Това ти дава .90 до втория знак.
[...]


";" би трябвало да е достатъчно:

Примерен код
$ a=`echo "scale=2;9/10"|bc`;echo $a
.90
$ a=`echo "scale=3;9/10"|bc`;echo $a
0.900


Цитат

Примерен код
a=`echo $a|replace . ,` - това сменя '.' с ','



Или директно с parameter expansion (bash, ksh93 и zsh):

Примерен код
$ a=$(echo "scale=5;562.207763/134.243935"|bc)
$ echo $a
4.18795
$ printf "%.2f\n" ${a/./,}
4,19


Но трябва да се внимава с locale-a:

Примерен код
$ a=$(echo "scale=5;562.207763/134.243935"|bc)
$ LC_ALL=it
$ printf "%.2f\n" ${a/./,}
4,19
$ LC_ALL=C
$ printf "%.2f\n" ${a/./,}
4.00




Активен


Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
BASH: Как да поддържам една програма работеща
Общ форум
Regia 1 13006 Последна публикация Feb 16, 2005, 08:51
от
bash
Настройка на програми
tuxi 7 8824 Последна публикация Jun 11, 2005, 19:12
от tuxi
Моля за малко помощ за BASH
Настройка на програми
bonbon 3 7107 Последна публикация Dec 04, 2005, 16:37
от bonbon
BASH
Общ форум
Dean79 3 7202 Последна публикация Jan 13, 2006, 00:24
от Dean79
Bash присвояване на стойност от файл
Общ форум
Pulear 6 7846 Последна публикация May 21, 2006, 17:20
от Pulear