Автор Тема: моля за малко помощ bash -> присвояване на стойност от /dev/null  (Прочетена 4939 пъти)

loshiat

  • Напреднали
  • *****
  • Публикации: 20
    • Профил
Здравейте. Имам следното:
route show | grep 'default' | grep -w "koko" > /dev/null
az=$( printf "$?" )

az присвоява стойност 1  ако няма думата коко или 0 ако я има.
Това което искам да направя е всичко да бъде на един ред. Опитах много начини но нещо ми убягва.
Мислех че така ще стане но уви не,

az=$(  printf "$?" | route show | grep 'default' | grep -w "koko" > /dev/null )

....къде греша?

Активен

dejuren

  • Напреднали
  • *****
  • Публикации: 1025
  • Distribution: Ubuntu, RedHat
  • Window Manager: lxde KDE4
    • Профил
Не знам къде точно грешиш, но резултата който искаш да постигнеш може да се получи така:
Код:
az=$( route show | grep 'default' | grep -vcw "koko" )
Провери дали точно инвертирането на втория grep с -v  е каквото ти трябва. (иначе grep -cw "koko") Последно - вземи предвид и възможността резултата от grep -c се получи различен от 0 или 1, което е малко вероятно, но все пак възможно, ако се получи грешка в рутинг-таблицата.

Най-добре обаче дай повече информация какво правиш, може някой да ти предложи различно по-ефективно решение, защото от това което виждам да ползваш променлива за true/false, която е кода на грешката от предната команда, и след което веднага да забравиш за нея няма много смисъл. Освен това конструкцията az=$( printf "$?" ) изглежда опасно и страховито за толкова просто нещо като проверка с grep, защо не направо az=$? като се е почнало?
« Последна редакция: Jul 21, 2012, 20:32 от dejuren »
Активен

http://webchat.freenode.net/?channels=ubuntu-bg
The quieter you become, the more you are able to hear.
Две седмици цъкане с мишката спестяват два часа четене на документацията.

dev_urandom

  • Напреднали
  • *****
  • Публикации: 114
  • Distribution: Slackware
    • Профил
@Loshiat, като правиш pipe получаваш резултата от последната команда, не гледай от ляво :)

P.S. От /dev/null не очаквай резултати , (не) пробвай с /dev/zero
« Последна редакция: Jul 22, 2012, 00:10 от dev_urandom »
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Малко ще повторя думите на dejuren....

За какво ще използваш az? В смисъл, ако ти трябва нещо от сорта на:

Код
GeSHi (Bash):
  1. route show | grep 'default' | grep -w "koko" > /dev/null
  2. if [ $? -eq 0 ]
  3. then
  4. #do something
  5. else
  6. #do another thing
  7. fi

променливата az=$(printf "$?") не ти трябва, не ти трябва и if [ $? -eq 0 ]:
Код
GeSHi (Bash):
  1. if route show | grep 'default' | grep -w "koko" > /dev/null
  2. then
  3. #do something
  4. else
  5. #do another thing
  6. fi

//offtopic
grep -w "koko" > /dev/null може да го смениш с grep -q -w "koko".
Активен

loshiat

  • Напреднали
  • *****
  • Публикации: 20
    • Профил
Благодаря на всички. Всички начини  ми вършат работа. Исках да проверява default Gateway кой е , защото имам 2 ISP-та и да прави разни работи...

bob багодаря за цитата на Geshi , това
if route show | grep 'default' | grep -w "koko" > /dev/null
    then
    #do something
    else
    #do another thing
    fi
така написано не съм го виждал но при 0 идва then ако не отива на else.
Тази проверка е която ми трябва. Направих няколко опита за да разбера как точно работи.
Благодаря на всички отново.
« Последна редакция: Jul 22, 2012, 16:05 от loshiat »
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Да, по принцип за "условия" на if, while, until се поставя команда/списък от команди/pipeline, тя/той се изпълнява и, ако е успешен (т.е. завърши със статус 0), се изпълняват командите в then (иначе, в else, ако има такъв). Отделно има възможност и за elif (ако главното "условие" завърши с неуспех, друга проверка).
Ето линк: http://pubs.opengroup.org/onlinepubs/009604499/utilities/xcu_chap02.html#tag_02_09_04_07

Използването на командата test ([]) за условия е само частен случай, но мнозина, може би по аналогия с други програмни езици, прилагат винаги и само нея. Аз лично наскоро срещнах следната бруталност:
Код
GeSHi (Bash):
  1. compound_command
  2. RESULT=$?
  3. if [ $RESULT = 0 ]; then
  4. ...
  5. else
  6. ...
  7. fi
(И дълго време не можех да повярвам какво виждат очите ми...)
Активен

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
...... Аз лично наскоро срещнах следната бруталност:
Код
GeSHi (Bash):
  1. compound_command
  2. RESULT=$?
  3. if [ $RESULT = 0 ]; then
  4. ...
  5. else
  6. ...
  7. fi
(И дълго време не можех да повярвам какво виждат очите ми...)
Марче, прости ми, но не виждам каква е бруталността, освен използването на = вместо -eq за сравняване на числови стойности
Останалото е добър и четим стил на писане. Или трябва да е криптирано подобно на пърл?
Активен

0x2B|~0x2B

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Мисля, че на perl условните оператори са от малкото четливи и еднозначни неща, чак досаднo. Примерно кода за всяко условие трябва да се затваря в собствен блок, дори да е само един ред и това ужасно дразни ако си свикнал с волностите на C. Освен което за разлика от bash скриптовете няма чак толкова идиотски особености, като например в колко скоби е затворено условието.
Активен

"Knowledge is power" - France is Bacon

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
romeo, ами за мен е глупаво - пускаш команда, взимаш си отделна променлива, в която да запишеш стойността на друга променлива ($?), и проверяваш дали тази стойност е exit status успех. След като може просто командата да е като условие на if и да си спестиш и допълнителната променлива, и извикването на test. За = и -eq, отделно.

Освен това считам за неправилно това човек да твърди, че владее няколко езика за програмиране, след като нивото му на владение е просто транслиране на съответните граматически конструкции. Т.е. това, което на C ще напише като
Код
GeSHi (C):
  1. int result = function();
  2. if(result == EXIT_SUCCESS)
  3. //или дори if(function() == EXIT_SUCCESS)
  4. {
  5. ...
  6. }
  7. else
  8. {
  9. ...
  10. }
на bash да го изразява с показания код. И само ако се сети, че на C може всъщност да ползва и варианта if(function())/if(!function()), да се сети, че и на bash може директно да сложи команда, различна от test, в условието.

Всеки език си има свой стил, дух, начин на използване, начин на действие. За мен познаването на тези неща във всеки отделен език са пряко свързани с писането на оптимален код на него. Хора без такива познания или са програмисти на езика X, или са програмисти на псевдокод с механизъм Google Translate на езика Y.

Аз не твърдя, че съм специалист относно това какъв е стила на bash или на някой друг език - опитвам се да се основавам на примери и мнения. Например си спомням (и следвам) съвета на един наш преподавател (с достатъчно качества и авторитет, че да му повярвам), който ни каза на C да не правим неща като if(function()) - да си бъде if(function() != 0).

В ситуацията за bash на мен логически по-правилно и четимо ми е if command, вместо command; if [ $? -eq 0 ]. Отделно, че има хора, които не са наясно, че конвенцията е една програма при успех да завърши със статус 0 (EXIT_SUCCESS), а при грешка - със статус положително число. :D Не че ги оправдавам, де. ;)

И ако command; if [ $? -eq 0 ] може просто да не е по мой вкус (наистина, не мога да твърдя, че е правилен или неправилен стил), то command ; result=$?; if [ $result -eq 0 ] наистина го считам за излагация.
Активен

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
romeo, ами за мен е глупаво - пускаш команда, взимаш си отделна променлива, в която да запишеш стойността на друга променлива ($?), ...
И ако command; if [ $? -eq 0 ] може просто да не е по мой вкус (наистина, не мога да твърдя, че е правилен или неправилен стил), то command ; result=$?; if [ $result -eq 0 ] наистина го считам за излагация.
Готов съм да се съглася за "транслирането" на логика от един език към друг, само че при шеловете такава конструкция:
result=$?; if [ $result -eq 0 ]
Има своя смисъл като например комбиниране на няколко логически условия, използване по-късно в кода, стигайки даже до увеличаване абстракцията и параметризиране на кода. А и е по-читаемо (поне за мен :) )
Активен

0x2B|~0x2B

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Готов съм да се съглася за "транслирането" на логика от един език към друг, само че при шеловете такава конструкция:
result=$?; if [ $result -eq 0 ]
Има своя смисъл като например комбиниране на няколко логически условия, използване по-късно в кода, стигайки даже до увеличаване абстракцията и параметризиране на кода. А и е по-читаемо (поне за мен :) )
Да, за по-сложни сценарии спор няма. Но в случая говорим за елементарното - ако една команда е успешна, правим нещо; ако не - (евентуално) правим друго. Без нищо повече в контекста. В такъв случай на мен дългото излияние ми става по-нечетимо, понеже обичам кратко и точно да са изказани нещата. Сигурно е въпрос на вкус, но аз не го одобрявам...
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Например си спомням (и следвам) съвета на един наш преподавател (с достатъчно качества и авторитет, че да му повярвам), който ни каза на C да не правим неща като if(function()) - да си бъде if(function() != 0).
Мдам, има известна логика ... По принцип не бих се съгласил да ползвам "if (isLoggedIn() !=0 ) {...}" вместо първия вариант, но ... заради спецификата на езика С не виждам как ще се реализира по друг начин error handling-а при липсата на Exceptions.
Въпреки това, за езици, които поддържат Exception, гореспоменатият вариант е твърде неприемлив за мен.
Но пак опираме до спецификата на използвания език...
Активен

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

груйо

  • Новаци
  • *
  • Публикации: 1
    • Профил
//offtopic

gat3way, да напишеш Perl и "волности" на С в едно изречение е престъпление. Донякъде си прав, че ако напишеш нормална if конструкция, трябва да я заградиш в скоби, но все пак Perl е език в който можеш да напишеш неща като:

Код
GeSHi (Perl):
  1. call() if $true;
  2. die unless success;
  3. next if not $line =~ /^\w+/;
  4.  

Та той не е точно език, който те ограничава. Според много хора основната слабост на езика е прекалената свобода, която позволява.
Активен