Автор Тема: Какъв резултат ще се изведе при изп на текстов файл от Bash команди  (Прочетена 1359 пъти)

TomTom

  • Участници
  • ***
  • Публикации: 3
    • Профил
Текстовият файл е :
set 1 1 1 1
n=0
m=0
for br
do
 n='expr$n+$br'
 shift
if test $n -ne 1
   then echo $n
   else m='expr $m+1'
       echo $?
fi
done

отг е 0 2 3 4

Разбирам какво се случва във for цикъла, но не разбирам как set 1 1 1 1 се връзва с br .Силно предполагам,навързвайки отг,че br в случай ще обхожда 1 2 3 4 ,т.к. 1-ците са 4...

И още нещо - каква е ролята на shift в случая!? Знам, че при shift число - стойностите се изместват наляво,като нулевият не се пипа...Ама тук не е така...

Супер начинаеща съм...засега и благодаря предварително :)

Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Първо, имай предвид, че има голяма разлика между различните кавички. В скрипта си написала единични кавички (тази, която е на клавиша с двойната кавичка; предполагам, че сама си ги вписала, иначе нямаше да се получи показаният отговор), а в случая става дума за единичната кавичка, намираща се в горния ляв ъгъл до клавиша 1 на клавиатурата. Докато обикновената единична кавичка огражда низ, който да се ползва такъв, какъвто е вписан (без четене на променливи или изпълнение на код между кавичките), другата единична кавичка се ползва за команда, която трябва да се изпълни между тези кавички. Освен това уважавай интервалите ;) Ето го скрипта с правилните кавички и обяснения кой ред какво прави:
Код
GeSHi (Bash):
  1. set 1 1 1 1 #задаване на безименен масив; все едно array=( 1 1 1 1 )
  2. n=0 #задаване стойност 0 на $n
  3. m=0 #задаване стойност 0 на $m
  4. for br #цикъл, обхождащ последно зададения безименен масив; все едно for br in array
  5. do
  6. n=`expr $n + $br` #сумиране на $n и текущата стойност на $br
  7. shift #изместване на масива с 1 позиция наляво; според мен нищо не прави в случая
  8. if test $n -ne 1 #ако $n е различно от 1
  9.   then echo $n #принтиране стойността на $n
  10.   else m=`expr $m + 1` #сумиране на $m+1
  11.       echo $? #извеждане на статуса на изпълнение на последната команда (горния ред; може да е 0, 1 или 2)
  12. fi
  13. done
Shell има свойството да пази и безименни масиви и той се извиква в този for, за който няма зададено какво да се обхожда. Променливата $br не е обвързана с този масив. Тя само приема текущата стойност от масива при обхождането. Т.е., тъй като масива ни съдържа 4 единици, $br винаги е равно на 1.
Тъй като при първото завъртане на цикъла $n=1, първата стойност от изведения на екрана резултат е изхода от командата
Цитат
expr $m + 1
Тъй като действието е изпълнено успешно, статусът на командата е 0, и затова първата стойност в общия резултат е 0. Ако предизвикаме грешка в изпълнението на командата на този ред, вместо 0 може да ни се изпише 1 (за нефатална грешка) или 2 (за фатална грешка). При следващите завъртания на цикъла $n не е равно на 1, така че просто се извежда стойността на $n, която се увеличава всеки път с едно, заради командата
Цитат
expr $n + $br
където $br винаги е 1, тъй като само такива стойности имаме в масива.
« Последна редакция: Apr 26, 2012, 20:19 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

TomTom

  • Участници
  • ***
  • Публикации: 3
    • Профил
Всичко схванах и брагодаря за бързия отговор и перефектното обяснение ^_^
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
BASH: Как да поддържам една програма работеща
Общ форум
Regia 1 10831 Последна публикация Feb 16, 2005, 08:51
от
bash
Настройка на програми
tuxi 7 6446 Последна публикация Jun 11, 2005, 19:12
от tuxi
Моля за малко помощ за BASH
Настройка на програми
bonbon 3 5071 Последна публикация Dec 04, 2005, 16:37
от bonbon
BASH
Общ форум
Dean79 3 5187 Последна публикация Jan 13, 2006, 00:24
от Dean79
Bash присвояване на стойност от файл
Общ форум
Pulear 6 6018 Последна публикация May 21, 2006, 17:20
от Pulear