Автор Тема: сравняване на променливи  (Прочетена 3726 пъти)

gotha

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

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

blurmind

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
сравняване на променливи
« Отговор #1 -: 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
Активен

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

gotha

  • Напреднали
  • *****
  • Публикации: 551
    • Профил
    • WWW
сравняване на променливи
« Отговор #2 -: Jan 06, 2007, 03:38 »
it is alive master !!!

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

blurmind

gotha

  • Напреднали
  • *****
  • Публикации: 551
    • Профил
    • WWW
сравняване на променливи
« Отговор #3 -: 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
Активен

blurmind

mironcho

  • Напреднали
  • *****
  • Публикации: 495
    • Профил
сравняване на променливи
« Отговор #4 -: Jan 06, 2007, 18:12 »
За добавяне във файла ползвай >> вместо > :
Примерен код
echo var3 greater >> log.txt
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
сравняване на променливи
« Отговор #5 -: Jan 07, 2007, 01:28 »
В кръга на шегата и педантичността '<img'> :

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

var2 greater or equal to var1

'<img'>

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

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

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

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

Поздрави!
Активен

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

gotha

  • Напреднали
  • *****
  • Публикации: 551
    • Профил
    • WWW
сравняване на променливи
« Отговор #6 -: Jan 08, 2007, 02:34 »
Благодаря за отговорите!
@VladSun струва ми се, че все пак трябва да си e:
var2 greater and not equal to var1
Активен

blurmind

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
сравняване на променливи
« Отговор #7 -: Jan 08, 2007, 02:58 »
Цитат (gotha @ Ян. 08 2007,02:34)
Благодаря за отговорите!
@VladSun струва ми се, че все пак трябва да си e:
var2 greater and not equal to var1

Нц '<img'>

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

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



Активен

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

gotha

  • Напреднали
  • *****
  • Публикации: 551
    • Профил
    • WWW
сравняване на променливи
« Отговор #8 -: Jan 08, 2007, 06:36 »
Уча се, уча се  '<img'>
Активен

blurmind

gotha

  • Напреднали
  • *****
  • Публикации: 551
    • Профил
    • WWW
сравняване на променливи
« Отговор #9 -: 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.  Ако някой смята, че такова решение би било по-лесно и има време, моля да напише как мога да се спрявя с това.
Благодаря предварително на отзовалите се !



Активен

blurmind

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
сравняване на променливи
« Отговор #10 -: Jan 14, 2007, 22:13 »
$3 е третият аргумент с който пускаш скрипта, нали?
Питам, защото нищо не казваш за него, а го използваш.

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



Активен

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

gotha

  • Напреднали
  • *****
  • Публикации: 551
    • Профил
    • WWW
сравняване на променливи
« Отговор #11 -: Jan 14, 2007, 23:25 »
Объркал съм нещо, трябва да е $tmp3 вместо $3, а в този момент tmp3 е равно на name$i. Тоест е променлива, която се използва само за цикъла.

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

blurmind

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
сравняване на променливи
« Отговор #12 -: 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

  • Напреднали
  • *****
  • Публикации: 551
    • Профил
    • WWW
сравняване на променливи
« Отговор #13 -: Jan 16, 2007, 03:25 »
Цитат (Hapkoc @ Ян. 15 2007,00:07)
(забележка: не гарантирам за вярност на горния скрипт)

Ей това му е най-кофтито на open source-a '<img'>

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

Благодаря за помощта !!!
Активен

blurmind

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
сравняване на променливи
« Отговор #14 -: Jan 16, 2007, 07:58 »
Я поясни малко?
Активен