Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: gotha в Jan 06, 2007, 01:08



Титла: сравняване на променливи
Публикувано от: gotha в Jan 06, 2007, 01:08
Искам първо да отбележа, че не съм професионалист. Пиша един малък shell script и се опитвам да сравня 2 променливи, но нещо се не получава.
Цитат
if [ "$var1new">"$var1" ]
then ...
fi

Проблема е че винати казва, че първата променлива е по-голяма от втората, без значение дали наистина е така. Самите променливи се извличат от файлове и при самото извличане съм сигурен, че няма проблем. Пробвах без кавички, с "-gt" вместо ">", с различни вариации при поставянето на празните места и какво ли още не. Нищо не променя положението.
Някой има ли идея къде бъркам.


Титла: сравняване на променливи
Публикувано от: VladSun в Jan 06, 2007, 01:25
Примерен код

#!/bin/bash

let var1new="6";
let var2new="7";

if [ $var1new -gt $var2new ]
then
        echo var1 greater
else
        echo var2 greater
fi


Титла: сравняване на променливи
Публикувано от: gotha в Jan 06, 2007, 03:38
it is alive master !!!

Благодаря много


Титла: сравняване на променливи
Публикувано от: gotha в Jan 06, 2007, 17:49
Може би тъпите въпроси взеха да ми стават прекалено много, но изникна нов проблем. Опитвам се да пиша изхода от определени действия във файл, но всяко следващо писане изтрива предишното, има ли начин всяко следващо писане да е на нов ред след предишното.
Примерно:
Цитат

#!/bin/bash

let var1new="6";
let var2new="7";
let var3new="1";
let var4new="2";

if [ $var1new -gt $var2new ]
then
       echo var1 greater > log.txt
else
       echo var2 greater > log.txt
fi

if [ $var3new -gt $var4new ]
then
       echo var3 greater > log.txt
else
       echo var4 greater > log.txt
fi

Искам в лог-а да пише :
Цитат

var2 greater
var4 greater

Но вместо това намирам само:
Цитат

var4 greater


Титла: сравняване на променливи
Публикувано от: mironcho в Jan 06, 2007, 18:12
За добавяне във файла ползвай >> вместо > :
Примерен код
echo var3 greater >> log.txt


Титла: сравняване на променливи
Публикувано от: VladSun в Jan 07, 2007, 01:28
В кръга на шегата и педантичността :) :

всъщност би трябвало да пише:

var2 greater or equal to var1

;)

Очаквах някой мен да ме поправи, ама сега реших сам да го направя :p

Иначе по въпроса:

http://www.codecoffee.com/tipsforlinux/articles2/043.html

ако имаш някакви трудности по-нататък.

Поздрави!


Титла: сравняване на променливи
Публикувано от: gotha в Jan 08, 2007, 02:34
Благодаря за отговорите!
@VladSun струва ми се, че все пак трябва да си e:
var2 greater and not equal to var1


Титла: сравняване на променливи
Публикувано от: VladSun в Jan 08, 2007, 02:58
Цитат (gotha @ Ян. 08 2007,02:34)
Благодаря за отговорите!
@VladSun струва ми се, че все пак трябва да си e:
var2 greater and not equal to var1

Нц :)

!(var1 > var2)  ===  (var2 >= var1)

Прилагаш малко странна двоична логика и операции в "5-state" режим (>, >=, < , <=, =)
;)





Титла: сравняване на променливи
Публикувано от: gotha в Jan 08, 2007, 06:36
Уча се, уча се  :D


Титла: сравняване на променливи
Публикувано от: gotha в Jan 14, 2007, 21:33
В опитите си да избегна използването на масиви стигнах до едно решение, което според мен би трябвало да работи, но не и според компютъра ми. Положението е следното : Искам да сравня определени променливи, но това да става с цикъл, а не да пиша за всяка от тях. За момента скрипта изглежда така:
Цитат

#/bin/bash

       { read var1
         read var2
         read var3
  # и така до 10
        } < /$HOME/file1
       
       {    read number   # общ брой на променливите, които ще сравнявам, в случая 10
           read name1   # име 1
           read varnew1   #променлива 1
           read name2
           read varnew2
           read name3
           read varnew3
# и така до 10

      } < /$HOME/file2

let i="1"
until [ $i -gt $number ]; do
      let tmp="varnew$i"
      let tmp2="var$i"
      let tmp3="name$i"
      if [ $tmp -gt $tmp2 ]
     then echo "$tmp3"
       fi
       let i="$i+1"
done

 

var1 е примерно 5
varnew1 e примерно 8
name е примерно Гошо, Пешо или каквото ви хареса.
Та идеята е, ако 8 е по-голямо от 5 да изведе "Гошо". На практика извежда това :
Цитат

0
0
0
0
0
0
0
0
0

Май нещо съм о*рал цикъла, но не мога да разбера къде и защо. Искам всички променливи да се вземат от отделни файлове и скрипта да може да работи без значение колко променливи има във файла, за това правя всичко.  Знам, че трябва да се направи цикъл и за четенето от файл, но ще решавам проблемите един по един.

П.С. За тези, които ще попитат защо не използвам масиви: Никъде не можах да намеря свястно обяснение в нет-а как се използват масиви в bash.  Ако някой смята, че такова решение би било по-лесно и има време, моля да напише как мога да се спрявя с това.
Благодаря предварително на отзовалите се !





Титла: сравняване на променливи
Публикувано от: VladSun в Jan 14, 2007, 22:13
$3 е третият аргумент с който пускаш скрипта, нали?
Питам, защото нищо не казваш за него, а го използваш.

ПП: Въпросът, според мен, не е защо не използваш масиви, а защо не използваш нещо по-добро за целта - прим. Perl ;)





Титла: сравняване на променливи
Публикувано от: gotha в Jan 14, 2007, 23:25
Объркал съм нещо, трябва да е $tmp3 вместо $3, а в този момент tmp3 е равно на name$i. Тоест е променлива, която се използва само за цикъла.

Нямам време да уча нов език, иначе и доста познати ми препоръчват perl. Дори не помня защо реших да използвам bash. На практика моята програмка си е почти готова, само остана тоя цикъл да го измисля.


Титла: сравняване на променливи
Публикувано от: Hapkoc в Jan 15, 2007, 00:07
Примерен код

#! /bin/sh

declare -a arr1
let i=0
while read var; do
        arr1[$i]=$var
        let i=$((i + 1))
done < file1

declare -a arr2
let i=0
while read var; do
        arr2[$i]=$var
        let i=$((i + 1))
done < file2

while [ $i -gt 0 ]; do
        if [ ${arr1[$i]} -gt ${arr2[$i]} ]; then
                echo "Pesho"
        else
                echo "Gosho"
        fi
        let i=$((i - 1))
done



Описание за работа с масиви в bash има в man страницата на bash. Мисля, че е достатъчно подробно.

Накратко - не е задължително да декларираш масива с declare, достатъчно е да присвоиш стойност на променлива с индекс (от рода на arr[0]=value) и масива с име arr ще бъде създаден автоматично. Задължително е да слагаш къдрави скоби при обръщение към стойностите на масива.

Дано ти свърши работа.

(забележка: не гарантирам за вярност на горния скрипт)





Титла: сравняване на променливи
Публикувано от: gotha в Jan 16, 2007, 03:25
Цитат (Hapkoc @ Ян. 15 2007,00:07)
(забележка: не гарантирам за вярност на горния скрипт)

Ей това му е най-кофтито на open source-a :)

Скрипта ти не е верен наистина, но грешките са дребни, основната част е ок. Започвам да съжалявам, че спах когато преподаваха pascal. Ще прочета по-обстойно man-a на bash и се надявам ситуацията да ми се изясни напълно.

Благодаря за помощта !!!


Титла: сравняване на променливи
Публикувано от: Hapkoc в Jan 16, 2007, 07:58
Я поясни малко?


Титла: сравняване на променливи
Публикувано от: gotha в Jan 16, 2007, 13:46
Имаш някои C забежки. Примерно :
let i=$((i - 1))
трябва да е :
let i="$i+1"
Не знам доколко моя вариант е правилен, но твоя със сигурност не работи. :) За мен по-важно беше да разбера що е туй масив в bash, така че тези неща не са от значение.


Титла: сравняване на променливи
Публикувано от: Hapkoc в Jan 16, 2007, 14:25
Цитат

Имаш някои C забежки. Примерно :
let i=$((i - 1))
трябва да е :
let i="$i+1"


Пич, и двата варианта са правилни bash конструкции, но правят съвсем различни неща. Първото е т.нар. arithmetic expansion (и това можеш да го потърсиш в manpage-а на bash(1)) - значи "нека i приеме стойност i минус едно".

Второто конкатенира стойността на i със низа "+1" и го присвоява на i.

Т.е. ако имаме стойност i=5, то резултата от първото действие ще е, че i ще стане равно на 4, а от второто, че i ще стане равно на низа "5+1".

Цитат

Не знам доколко моя вариант е правилен, но твоя със сигурност не работи.


Ако под "не работи" имаш предвид, че не прави това, което ти искаш - много вероятно е да е така. Ако имаш предвид, че не се изпълнява, смисъл дава грешка или нещо от тоя род - еми тествал съм го при мен преди да го пусна във форума и работи.

Именно това имах предвид под "забележка: не гарантирам за вярност на горния скрипт", а именно - не гарантирам, че прави това, което искаш. Иначе гарантирам, че работи така както съм имал предвид да работи.

Цитат

За мен по-важно беше да разбера що е туй масив в bash, така че тези неща не са от значение.


Скрипта, който пуснах трябваше да е демонстрация за работа с масиви в bash. Ако не съм успял да ти помогна с него - съжалявам, но повече не мога да направя.


Поздрави.





Титла: сравняване на променливи
Публикувано от: radoulov в Jan 16, 2007, 14:26
Цитат (gotha @ Ян. 16 2007,14:46)
Имаш някои C забежки. Примерно :
let i=$((i - 1))
трябва да е :
let i="$i+1"
Не знам доколко моя вариант е правилен, но твоя със сигурност не работи. :)

Можеш ли да дадеш пример къде/кое точно не работи?
Ако говорим за bash:

$ echo $0 && echo $BASH_VERSION
-bash
3.00.15(1)-release
$ i=1
$ let i=$((i + 1))
$ echo $i
2
$ i=1
$ let i="$i+1"
$ echo $i
2

Като всъщност в bash е достатъчно:

$ i=1
$ i=$((i+1))
$ echo $i
2

или за по-новите версии на bash:

$ i=1
$ i=$((++i))
$ echo $i
2





Титла: сравняване на променливи
Публикувано от: Hapkoc в Jan 16, 2007, 14:58
Прочитайки поста на radoulov се усетих, че съм в грешка с предишния си пост, а именно:

let i="$i+1" е същото като let i=$((i+1))

докато при само

i="$i+1" ще се получи конкатенацията, за която писах. Останалата част от поста ми важи.


Титла: сравняване на променливи
Публикувано от: gotha в Jan 16, 2007, 17:49
Всъщност: вие сте прави, аз - не.
@Hapkoc Имах в предвид, че наистина ми помогна да разбера това, което ми трябваше (масивите в bash), без значение дали скрипта ти е верен или не.
Аз си направих цикъла по малко по-различен начин.

Цитат

let i="$i+1" е същото като let i=$((i+1))

Относно това, преди време бях пробвал let i=$((i+1)) в цикъла, но ми даде някаква грешка (вече не помня каква) и от тогава съм останал с впечатлението, че този вариант не работи.