Linux-BG
Начало
Помощ
Търси
Календар
Вход
Регистрирай
Добре дошъл/дошла,
Гост
. Моля,
въведи своето потребителско име
или
се регистрирай
.
Влез с потребителско име, парола и продължителност на сесията
Linux за българи: Форуми
>
Програмиране
>
Общ форум
>
сравняване на променливи
Страници: [
1
]
2
Надолу
« назад
напред »
Изпечатай
Автор
Тема: сравняване на променливи (Прочетена 3726 пъти)
gotha
Напреднали
Публикации: 551
сравняване на променливи
«
-:
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 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират
gotha
Напреднали
Публикации: 551
сравняване на променливи
«
Отговор #2 -:
Jan 06, 2007, 03:38 »
it is alive master !!!
Благодаря много
Активен
blurmind
gotha
Напреднали
Публикации: 551
сравняване на променливи
«
Отговор #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 »
В кръга на шегата и педантичността
'> :
всъщност би трябвало да пише:
var2 greater or equal to var1
'>
Очаквах някой мен да ме поправи, ама сега реших сам да го направя
Иначе по въпроса:
http://www.codecoffee.com/tipsforlinux/articles2/043.html
ако имаш някакви трудности по-нататък.
Поздрави!
Активен
KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират
gotha
Напреднали
Публикации: 551
сравняване на променливи
«
Отговор #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
Нц
'>
!(var1 > var2) === (var2 >= var1)
Прилагаш малко странна двоична логика и операции в "5-state" режим (>, >=, < , <=, =)
'>
Активен
KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират
gotha
Напреднали
Публикации: 551
сравняване на променливи
«
Отговор #8 -:
Jan 08, 2007, 06:36 »
Уча се, уча се
'>
Активен
blurmind
gotha
Напреднали
Публикации: 551
сравняване на променливи
«
Отговор #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
'>
Активен
KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират
gotha
Напреднали
Публикации: 551
сравняване на променливи
«
Отговор #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
сравняване на променливи
«
Отговор #13 -:
Jan 16, 2007, 03:25 »
Цитат
(Hapkoc @ Ян. 15 2007,00:07)
(забележка: не гарантирам за вярност на горния скрипт)
Ей това му е най-кофтито на open source-a
'>
Скрипта ти не е верен наистина, но грешките са дребни, основната част е ок. Започвам да съжалявам, че спах когато преподаваха pascal. Ще прочета по-обстойно man-a на bash и се надявам ситуацията да ми се изясни напълно.
Благодаря за помощта !!!
Активен
blurmind
Hapkoc
Напреднали
Публикации: 2117
сравняване на променливи
«
Отговор #14 -:
Jan 16, 2007, 07:58 »
Я поясни малко?
Активен
Страници: [
1
]
2
Нагоре
Изпечатай
« назад
напред »