Skip to content

Latest commit

 

History

History
135 lines (75 loc) · 8.24 KB

README.md

File metadata and controls

135 lines (75 loc) · 8.24 KB

Командни процедури, командни процедури с позиционни параметри

Какво е командна процедура?

  • поредица от команди, поместена в текстов файл.

Какво е специфично за тях?

  • командната процедура се изпълнява в отделен subshell, който се поражда от терминала, от който е извикана.

  • Когато процедурата приключи, тя има код на приключване (число от 0 до 255), като той може да бъде указан явно чрез exit код.

    • ако използваме exit без параметър, то кодът на завършване на КП = кода на завършване на последната изпълнена команда преди exit.

    • Ако не е указан exit, то кодът на завършване е кодът на последно изпълнената команда от КП.

  • коментарите на един ред се означават с #

Как да изпълним командна процедура?

1.Aко нямаме права за права за изпълнение

bash path-to/command_procedure

bash -x path_to/command_procedure - дава ни информация кои команди се изпълняват

  1. Добавяме право за изпълнение:

chmod a+x path_to/command_procedure

И за да изпълним командната процедура изписваме абсолютния й път

Защо в някои командни процедури има #!/bin/bash?

Чрез #! path_to_interpreter задаваме кой команден интерпретатор да използваме при изпълняване на командната процедура.

Пример:

#!/bin/csh - използваме C shell интерпретатора

#!/usr/bin/python3 - използваме python3 интерпретатор

Забележка:

Този ред сe изпълнява само ако сме изпълнили файла по този начин: ./script_name

Каква е разликата между #!/bin/bash и #!/bin/sh?

От първото упражнение знаем че Shell и Bash са различни командни интерпетатори. Но в повечето ОС /bin/sh е символна връзка, която няма да "събуди" шел интерпретатора, а ще изпълни това, с което е свързана.

Комадни процедури с позиционни параметри

Когато изпълняваме една командна процедура, можем да и дадем и някакви параметри:

./our_script param1 param2 ...

Как да ги достъпим в нашата командна процедура?

Командният интерпретатор присвоява тези параметри на специални системни променливи 0, 1, 2 ... като всяко число n отговаря на n-тия подаден позиционен параметър.

!!! $0 винаги пази името на командата

Така ако изпълним командната процедура our_script по този начин:

./our_script param1 param2 param3

То позиционните параметри ще за запазени по този начин:

еcho $0  # our_script
echo $1 # param1
echo $2 # param2
echo $3 # param3

Как можем да получим повече информация за позиционните параметри?

  • * - дава символен низ с параметрите от командния ред

  • @ - дава масив с параметрите от командния ред

  • # - дава броя на параметрите от командния ред

Следователно относно по-горния пример:

еcho $*  # param1 param2 param3
echo $@ # param1 param2 param3
echo $# # 3

Каква друга информация можем да получим в КП?

  • $ - PID на текущия процес

  • ? - код на завършване на последния завършил процес

  • ! - PID на последния завършил процес във фонов режим

Променяне на стойностите на 0, 1, 2 ...

  1. В нашата командна процедура можем да променим стойностите на променливите 0, 1, 2 ...

    Използваме командата set new_pos_arg1 new_pos_arg2

    Съответно ако сме имали:

    echo $1 $2 $3 # param1 param2 param3

    Ако някъде в КП имаме:

    set new1 new2

    то

    echo $1 $2 $3 # new1 new2

  2. Също така можем да "преместваме" стойностите на позиционните параметри наляво

    shift n - измества стойностите на позиционните параметри с n позиции наляво

    Съответно ако:

    echo $1 $2 $3 # param1 param2 param3

    и някъде в КП сме изпълнили

    shift 2

    то echo $1 $2 $3 # param3

Задачи:

1.Да се напише командна процедура, която чете от стандартния вход име на директория. Извежда на стандартния изход информация за всички файлове в текущата директория, чиито име е точно три символа, като последният е цифрата 1,2 или 3. Записва във файла file_type първите 5 файла от прочетената директория, които съдържат ASCII текст, а за тези, които съдържат програми на Си (C file), извеждат на екрана броя им с подходящо съобщение.

  1. Да се напише командна процедура, която получава при стартиране име на файл. Командната процедура изпраща съдържанието на файла до първия логически включен потребител, който е разрешил писането. След това прочита от стандартния вход име на директория и име на файл. Записва съдържанието на директорията в този файл. Ако тази директория е празна я изтрива.

  2. Да се напише командна процедура, която получава при стартиране произволен брой низове. Извежда на стандартния изход броя на директориите в началната потребителска директория, чиито име съдържа първия низ. Премества с 2 позиции наляво позиционните параметри и записва новото съдържание на позиционните параметри във файл, прочетен от стандартния вход. В този файл записва датата, календара за текущия месец и PID-то на текущия процес.

  3. Да се напише командна процедура, която стартира редактора vi във фонов режим. Намира PID-то на кореспондиращия процес и го убива. Извежда на стандартния изход кода на завършване на kill командата с подходящо съобщение.