LINUX.ORG.RU

Bash - (x2+y2)/(x+y)

 , , ,


1

2

Здравствуйте Это мое первое сообшение у вас на сайте , надеюсь не ошибочно создаю. Я изучаю БАШ. вот мой скрипт

#!/bin/bash

x=(1 2 3 4)
y=(1 2)

XArraySumSUM=${#x[@]}
YArraySum=${#y[@]}

for ((  i=0 ; i<$YArraySum ; i++ ))
do
for ((  e=0 ; e<$XArraySumSUM ; e++ ))
do
Z=$(echo "scale=3; $[${x[e]}**2+${y[i]}**2]/$[${x[e]}+${y[i]}]"| bc -l)
echo "Array X the $[$e+1] element is ${x[e]} and Array Y $((i+1)). Element is ${y[i]} RESULT:" $Z

done
done

я не могу сделать проще именно этот паттерн :

$[${x[e]}**2+${y[i]}**2]/$[${x[e]}+${y[i]}]
тут на самом деле делается Z=(x2+y2)/(x+y)

Можете помочь ?

Благодарю .



Последнее исправление: CYB3R (всего исправлений: 4)

И шо, баш уже умеет float/double? Это в какой параллельной реальности?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от abs

Сделать паттерн проще, очевидно же

Я думал помочь избавится от bash и перейти на java, python

aspel
()

Извини, не успел предупредить - сейчас от неосиливших арифметику посыпятся предложения перейте на python/R/JS/asm/Matlab и прочее
Тут так принято, не обращай внимание

zolden ★★★★★
()
Ответ на: комментарий от zolden

да не важно Думаю ,я не против)) Люди имеют права написать свои мнение .

GoodMan
() автор топика
Ответ на: комментарий от aspel

на самом деле не знаю можете ли помочь просто мне так кажется что тут , $[${x[e]}**2+${y}**2]/$[${x[e]}+${y}]

можно пользоваться каким то function-ом или еще что то ... но я не знаю

или все так и я сделал нормально что бы из массива брать элементы и решать этот вопрос "(x2+y2)/(x+y)" (???)

GoodMan
() автор топика
Ответ на: комментарий от GoodMan

если не ошибаюсь это .js

Однако! Писал на шел, оказывается получился js. Я волшебник!

Жги еще!

anonymous
()
Ответ на: комментарий от GoodMan

надеюсь не ошибочно создаю.

Ошибочно. Надо было в Development :-)

если не ошибаюсь это .js

Он просто хитро написал echo "2.5+3.7" | bc -l

AS ★★★★★
()
Последнее исправление: AS (всего исправлений: 1)

а ещё посаны посоветуйте fft для bash

anonymous
()
Ответ на: комментарий от zolden

Но мне всё равно не понятно, почему в bash есть тип int как отдельная данность, но при этом нет поддержки float? Хотябы тупого, 32-битного.

nexfwall ★★★★
()
Ответ на: комментарий от AS

Он просто хитро написал

Удобно и наглядно

anonymous
()

Какой ужас... Починил.

x=(1 2 3 4)
y=(1 2)

for i in $(seq "0" "$((${#x[@]} - 1))"); do
  for e in $(seq "0" "$((${#y[@]} - 1))"); do
    z="$(echo "scale=3; x=${x[$i]}; y=${y[$e]}; (x^2 + y^2)/(x + y)" | bc -ql)"
    printf 'x[%i] = %i; y[%i] = %i; z = %s\n' "${i}" "${x[$i]}" "${e}" "${y[$e]}" "$z"
  done
done

nexfwall ★★★★
()
Последнее исправление: nexfwall (всего исправлений: 3)
Ответ на: комментарий от GoodMan
math3() { eval "${*/=/=\$(echo \" scale=3; }" '" | bc -l )' ; }




x=${x[$i]}
y=${y[$e]}
math3 res="($x^2 + $y^2)/($x + $y)"

echo $res

вот так вот ))) намного логичнее )) !!

anonymous
()

Вот тебе еще из моего ~/.bashrc:

function round(){ [ "$2" = "" ] && NUM=3 || NUM=$2; echo $1 | sed "s/\([[:digit:]]*\.[[:digit:]]\{,$NUM\}\).*/\1/"; }
function sin(){ echo "scale=10; s($1*a(1)/45);" | bc -l; }
function cos(){ echo "scale=10; c($1*a(1)/45);" | bc -l; }
function tan(){ echo "scale=10; arg=$1*a(1)/45; s(arg)/c(arg);" | bc -l; }
function logn(){ echo "scale=10; l($1);" | bc -l; }
function log(){ echo "scale=10; l($1)/l(10);" | bc -l; }
function pow(){ echo "scale=10; ($1)^($2);" | bc -l; }
function sqrt(){ echo "scale=10; sqrt($1);" | bc -l; }
function exp(){ echo "scale=10; e($1);" | bc -l; }
function bin2hex(){ echo "obase=16;ibase=2;$1" | bc; }
function bin2dec(){ echo "obase=10;ibase=2;$1" | bc; }
function dec2hex(){ echo "obase=16;ibase=10;$1" | bc; }
function lower(){ echo $1 | tr [:upper:] [:lower:]; }
function upper(){ echo $1 | tr [:lower:] [:upper:]; }
function hex2binary(){ echo "obase=2;ibase=16; $(upper $1)" | bc; }
function hex2dec(){ echo "obase=10;ibase=16; $(upper $1)" | bc; }
alias pi="echo 'scale=10; a(1)*4;' | bc -l"
export pi=$(pi)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от nexfwall

Но мне всё равно не понятно, почему в bash ... нет поддержки float

Потому, что у bash назначение совсем другое.

AS ★★★★★
()
Ответ на: комментарий от Eddy_Em

И образец выхлопа:

round 2.34567 2
2.34

sin 55
.8191520441

cos 55
.5735764365

tan 45
.9999999998

logn 256
5.5451774444

log 256
2.4082399653

pow 3 52
6461081889226673298932241

sqrt 123456789
11111.1110605555

exp 123
261951731874906267618898102537463908796843700552130039.7502040792

bin2hex 1001110110110
13B6

bin2dec 1001110110110
5046

dec2hex 1026
402

lower "Превед, Медвед"
превед, медвед

upper "Превед, Медвед"
ПРЕВЕД, МЕДВЕД

hex2binary ffcb
1111111111001011

hex2dec ffcb
65483

pi   
3.1415926532

echo $pi
3.1415926532

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от nexfwall

Потому что bash развивается путём копирования фич из zsh с задержкой в 10-15 лет
Просто надо немножко потерпеть

zolden ★★★★★
()
Ответ на: комментарий от anonymous

Это не логичнее, это костыльнее. юзать eval чтобы объявить какую-то левую глобальную переменную. Заметь, глобальную, а не лексическую. Уж лучше выхлоп перехватывать.

nexfwall ★★★★
()
Ответ на: комментарий от AS

Забавно. Но людишки всё равно, вместо того чтобы его допилить, костылят над ним всякие перлы метапрограммирования.

nexfwall ★★★★
()
Ответ на: комментарий от nexfwall

Но людишки всё равно, вместо того чтобы его допилить

Его не надо допиливать. Он хорош для свих задач. А то, где нужна плавающая точка, писать надо уже не на баше.

AS ★★★★★
()
Ответ на: комментарий от AS

Его не надо допиливать.

Юникод. Знаменитая проблема с переменной в пайпе. Динамический PS1. А кроме этого - согласен.

Kroz ★★★★★
()

Видно, что ты уже программируешь на чем-то. У bash свой подход у программированию, который делает его легче и читабельней. Например, массивы редко когда нужны.

Сравни (пишу однострочниками, чтобы сразу в командную строку можно было):

Твое:

$ x=(1 2 3 4) ; XArraySumSUM=${#x[@]} ; for ((i=0;i<XArraySumSUM;i++)) ; do echo "${x[i]}" ; done

Заменить на:

$ x="1 2 3 4" ; for xi in $x ; do echo "$xi" ; done

Потому, что:

$ for A in 1 2 cool "abra kadabra" ; do echo "$A" ; done
$ for A in $( ls -1 ) ; do echo "$A" ; done
$ for A in * ; do echo "$A" ; done

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от nexfwall

И да, zsh например, не мешает поддержка float.

Сколько init-скриптов написано на zsh ? В каком количестве дистрибутивов zsh - шелл по-умолчанию ? Вообще, для чего плавающая точка в языке сценариев для управления системой ?

Это - лишний код, лишнее место возникновения ошибок и т.п. В крайнем случае, для тех, кто желает стоя и в гамаке, есть уже описанные тут варианты.

AS ★★★★★
()
Ответ на: комментарий от nexfwall

это шел, детка, тут eval и глоб. переменные это норма.

anonymous
()
Ответ на: комментарий от AS

Сколько
В каком количестве
Вообще, для чего

Ты несмешной клоун, запутавшийся в собственных аргументах
Уходи

zolden ★★★★★
()
Ответ на: комментарий от zolden

Ты несмешной клоун, запутавшийся в собственных аргументах

Тебе не хватает соображалки понять аргументы ? :-) Бывает, что ж.

AS ★★★★★
()
Ответ на: комментарий от AS

На bash сейчас тоже init-скрипты не пишут(systemd, лол). zsh имеет режим совместимости с sh. Так что, вполне можно пихнуть и zsh.

Если этот лишний код позволит сделать шелл куда более полезным, а код куда менее набором костылей для постоянного метапрограммирования, почему бы и нет?

nexfwall ★★★★
()
Последнее исправление: nexfwall (всего исправлений: 1)
Ответ на: комментарий от nexfwall

Да ты спроси этого клоуна про любую фичу шелла и пусть попробует аргументировать почему это не лишний код.
Это типичный трололо

zolden ★★★★★
()
Ответ на: комментарий от nexfwall

systemd, лол

Это отдельный разговор.

а код куда менее набором костылей для постоянного
метапрограммирования, почему бы и нет ?

Зачем из bash делать второй zsh или, вовсе, perl/python/разное ?

Так что, вполне можно пихнуть и zsh.

Можно, но а смысл ? Даже в bash-е, вон, дырки нашли. Казалось бы, проверен и перепроверен.

AS ★★★★★
()
Ответ на: комментарий от Kroz

Юникод.

А что не так с юникодом ? Но, вообще, ни разу не возникало необходимости в обработке национальных символов в bash.

Знаменитая проблема с переменной в пайпе.

Это про то, что изменения переменных внутри, например, циклов теряются ? Ну так есть же решение.

AS ★★★★★
()

Здравствуйте, подскажите как проще сделать следующее: в выводе программы ожидаем строку «process:GetProcessW...» и как только она появится выполняем команду notify-send ...

Сейчас сделал так, но тут костыль на костыле и костылем погоняет

WINEPREFIX=$HOME/games/sc wine "$HOME/games/sc/drive_c/Program Files (x86)/StarCraft II/Support/SC2Switcher.exe" 2>&1 | while read line ; do  if echo $line | grep -q "process:GetProcessWorkingSetSize (0xffffffff,0x6c1f2e8,0x6c1f2ec)"; then notify-send 'SC' 'Game is starting' --icon=$HOME/games/sc/mPzCdeL.png; fi ; done

anonymous
()
Ответ на: комментарий от anonymous
WINEPREFIX=$HOME/games/sc wine \
    "$HOME/games/sc/drive_c/Program Files (x86)/StarCraft II/Support/SC2Switcher.exe" 2>&1 | \
    { grep -q "process:GetProcessWorkingSetSize (0xffffffff,0x6c1f2e8,0x6c1f2ec)" && \
      notify-send 'SC' 'Game is starting' --icon=$HOME/games/sc/mPzCdeL.png;           }
nexfwall ★★★★
()
Ответ на: комментарий от nexfwall

Спасибо, но я совсем забыл уточнить, что срабатывать должно на каждую строку «process:...», а не только на первое совпадение

anonymous
()
Ответ на: комментарий от nexfwall

почему в bash есть тип int как отдельная данность, но при этом нет поддержки float?

А почему он там должен быть? Есть ли он, скажем, в виндовом cmd?
Второй вопрос - риторический.

blexey ★★★★★
()
Ответ на: комментарий от blexey

А почему он там должен быть?

Для поддержки математики, очевидно жеж. Да, для крутого матана, с синусами и косинусами есть bc, это да. Но не уметь сложить 2 числа...

Есть ли он, скажем, в виндовом cmd?

Зато он есть в новомодном PowerShell, который давно уже заменил собой его. И да, ответ риторический.

nexfwall ★★★★
()
Ответ на: комментарий от anonymous

Тогда твой изначальный вариант только, с буффером. Иначе grep завершает всё раньше, чем оно дойдёт до второго совпадения, съев в себя весь ввод.

nexfwall ★★★★
()
Ответ на: комментарий от nexfwall

Для перелопачивания текстовиков, к примеру, есть awk, в котором есть в т.ч. и float'ы. Видать, они нужнее оказались там, чем в шелл-скриптах.

blexey ★★★★★
()
Ответ на: комментарий от blexey

У тебя с головой всё впорядке? Я тебе про Фому, ты мне про Ерёму.

Каким боком тут сдался awk, если я говорю про внутренний оператор bash, который обозначается не иначе как (()).

nexfwall ★★★★
()
Ответ на: комментарий от nexfwall

Наверно тебя заклинило. Ну нету его там. Не нужен оказался никому, кроме любителей zsh, тебя и тролля ТС.

blexey ★★★★★
()
Последнее исправление: blexey (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.