На главную страницу | Новости  |  Ссылки | Контакты

Spyphy Farnsworth
Квантовая реальность. Кибернетика. Искусственный интеллект


Основы работы с командной строкой BASH


Управление заданиями (программами, работами) на BASH


p1 & p2 & p3 & -- запуск параллельно

p1; p2; p3; -- запуск последовательно

jobs -- список запущенных заданий

^C -- завершить программу

^Z -- приостановить выполение программы

bg %1 -- продолжить выполение в фоне

fg %1 -- перевести на передний план

% -- вернуться к последней остановленной программе

kill -CONT %1 -- послать сигнал CONT

1. Основные команды интерпретатора Bourne shell:


#!/bin/sh -- путь к интерпретатору Bourne shell

#!/bin/bash -- путь к интерпретатору BASH

Входные параметры:


$1 - $9 - Это так называемые позиционные параметры, служат для передачи аргументов командной строки. Если аргументов больше 9, то они должны заключаться в фигурные скобки{}

$0 - Имя скрипта который был запущен.

$# - Количество аргументов командной строки или позиционных параметров (имя скрипта не счит-ся)

$? - Код с которым была завершена предыдущая команда. Если команда была выполнена удачно,

то значение этой переменной будет 0, если же неудачно то не 0.

$$ - Номер процесса под которым исполняется данный скрипт, очень удобно использовать

в имени файла что бы сделать его уникальным.

$! - Номер последнего, запущенного в фоне процесса.

$- Список флагов переданных сценарию. Годиться разве что для проверки интерактивного режима.

$* - Данный параметр содержит в себе все параметры переданные из командной строки.

$@ - То же самое что $*, только каждый параметр представлен отдельно.

$_ - Специальная переменная, содержит последний аргумент предыдущей команды.

~Особенности:

-- нельзя вставлять лишние пробелы, если они там не предусмотрены (например, в a=$b );

";" -- означает "конец команды" (в конце строки не обязательна, но удобна).

a=33; -- присвоение переменной числового значения;

a='33'; a="33"; -- строковая переменная;

b=$a -- получение значения переменной по имени.

список операторов:

exit 1 -- выход из скрипта и возврат значения

export a -- экспортирует переменную в окружение (env)

Порядок выполнения программ в среде BASH:


cmd1 && cmd2 -- 2-ая команда выполняется, только если 1-ая завершилась успешно (TRUE)

cmd1 || cmd2 -- 2-ая команда выполняется, только если 1-ая завершилась неуспешно (FALSE)

{cmd1; cmd2; cmd3} -- группировка команд

Простой пример скрипта bash:


#!/bin/bash
 
a=22; b='33'; c=33; echo $a; echo $b; echo $c;

Арифметические операции:


"+", "-", "*", "/", "++" и "--" (работа в основном с целовыми числами)

$((expression)) -- для вычислений нужно брать выражение в двойные скобки и ставить $;

a=2; b=3;

d=$(($a+$b));

x=$((2*3));

~Замечание:

Аримф. операции также можно производить с помощью команды let:

let "c = a + b" #сложение

let "c = a / b" #деление

+ — сложение

— — вычитание

* — умножение

/ — деление

** — возведение в степень

% — модуль(деление по модулю), остаток от деления

сокращения: a +=b и т.д

Управляющие операторы bash:


1) if -- проверка условий:


test условие
или
[ условие ]		(обязательно пробелы)
 

программа test возвращает:

0 = TRUE -- если условие выполняется

1 = FALSE -- если условие не выполняется

Для чисел:

[ "число" -eq "число" ]

-eq == (равно)

-ne != (не равно)

-gt >

-lt <

-ge >=

-le <=

Пример:

[ 10 -qt 5 ] -- 10>5

echo $? -- вывод кода завершения последней программы

Пример использования оператора if

if  [  $res -eq "0"  ];  then
  echo "ok";
  exit 0;
fi

~Сравнение строк:

if [ "333" = "333" ]; then echo 1; fi; - должны быть пробелы!

(1) s1 = s2

(2) s1 != s2

(3) s1 < s2

(4) s1 > s2

~Полная форма оператора if:

if [ условие ]				# если новая строка, то ";" можно не писать
then
	команды
else
	команды
fi

2) case:


case $variable in
     pattern1)      
          commands
          ;;
     pattern2|pattern3|pattern4)
          commands
          ;; 
     *)
          commands
          ;;
esac

* Циклы

1) Цикл for-in


for переменная in list

do

команды

done

Пример:

for x in 0 1 2
do
	echo $x;
done

2) Используя раскрытие скобок (brace expansion) -- bash версии 3 и выше.

for a in {1..10}
do
  echo -n "$a "
done  

3) используя C-подобный синтаксис

for ((a=1; a <= LIMIT ; a++))  # Двойные круглые скобки и "LIMIT" без "$".
do
  echo -n "$a "
done                         # Конструкция заимствована из 'ksh93'.

2) цикл while


while [ условие ]
 do 
 команда(-ы)... 
 done
 

при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ ";" перед do:

while [ условие ] ; do
while [ "$var0" -lt "$LIMIT" ]
#      ^                    ^
 
# Пробелы, так как используются квадратные скобки - аналог команды test . . .
do echo -n "$var0 " # -n подавляет перевод строки. # ^ Пробел, чтобы разделить выводимые числа. var0=`expr $var0 + 1` # var0=$(($var0+1)) также допустимо. # var0=$((var0 + 1)) также допустимо. # let "var0 += 1" также допустимо. done

http://www.bash-scripting.ru/abs/chunks/ch10.html

или

#!/bin/bash 
 
i=0 while [ $i -lt 22 ] do touch $i i=$[$i+1] done

Работа со строками в BASH:


${#string} - Длина строки

Извлечение подстроки:

${string:position} - с position до конца (нумерация с 0)

${string:position:length} - с position длиной length символов

${string: -length} - последние length символов

Удаление части строки:

${string#substring} - до первого с начала

${string##substring} - до последнего с начала

${string%substring} - до первого с конца

${string%%substring} - до последнего с конца

Замена подстроки:

${string/substring/replacement} - первое вхождение

${string//substring/replacement} - все вхождения

Примеры:

a="12345"; echo "${a}"; echo "${a:3}"; echo "${a#12}"; echo "${a/12/21}"

Объединение строк:

a="red";

b="bool";

echo $a $b; // результат: red bool

c="$a $b";

c=$a\ $b;

echo $c;

echo "$a $b"; // результат: red bool

echo '$a $b'; // результат: $a $b

т.е. кавычки " " обрабатывают спецсимволы, а апострофы ' ' нет.

------------------------------------

ВВОД И ВЫВОД ДАННЫХ В SHELL BASH:


Стандартные потоки ввода/вывода:


дескриптор название файла

0 -- stdin (станд. поток ввода)

1 -- stdout (станд. поток вывода)

2 -- stderr (станд. поток ошибок)

Файловый вводы/вывод:


команда > файл -- направляет станд. поток вывода в новый файл

команда 1> файл -- (то же самое)

команда >> файл -- направляет станд. поток вывода в указанный файл (режим присоединения)

команда < файл -- в станд. вх. поток получает данные из указанного файла

команда << разделитель -- получает данные из stdin пока не встретит разделитель

команда echo:


echo "строка"

echo [оптии] "строка"

Оптии (для linux):

-n - запрет вывода символа новой строки

-e - активация управляющих символов (\c \f \ n \t)

Управляющие символы

\c - запрещает отображение концевого символа новой строки

\f - прогон страницы

\n - новая строка

\t - табуляция

Добавление собственных ФУНКЦИИ в bash:


function ИМЯ_ФУНКЦИИ () {
  local x=0;		# локальные переменные
  команды тела функции
}

typeset -f -- Посмотреть список функций

unset -f -- "разопределить" функцию

Пример:

math(){
  # local variable x and y with passed args	
  local x=$1
  local y=$2
  echo $(( $x + $y ))
}

вызов:

math 5 10

function myfunc()
 {
 local myresult='some value'
 echo "$myresult"
 }
result=$(myfunc) # or result=`myfunc`
echo $result

Полезные возможности:


$RANDOM -- a random integer between 0 and 32767

Некоторые команды (утилиты) оболочки shell:


tr [опция] набор1 [набор2] -- служит для перевода (замены) выбранных символов в другие символы или удаления их.

$ tr a b < file1.txt > file1.txt

Опция -d -- Используется для удаления из текста символов, перечисленных в наборе1.

$ echo a black cat | tr -d a

$ tr -d '\r' < ms.file < unix.file

Опция -с

Заставляет команду работать с символами, которые отсутствуют в наборе 1. Другими словами: символы, перечисленные в наборе1 не используются в работе, а все остальные - используются. Например:

$ echo a black cat | tr -cd b-z[:cntrl:][:blank:]

blck ct

xargs [-l число] [-i зам_цеп] [-n число] [-t] [-p] [-x] [-s размер] [-e [лконф_цеп]] [команда [начальный_аргумент…]]

xargs - утилита для формирования списка аргументов и выполнение команды в UNIX-подобных операционных системах. Команда xargs объединяет зафиксированный набор заданных в командной строке начальных аргументов с аргументами, прочитанными со стандартного ввода, и выполняет указанную команду один или несколько раз.

find -- используется для нахождения файлов и каталогов.

find [путь] [опции] [критерии поиска] [действия над файлами]

пр.,

find . -name "*page*"

find . -type f -name "~*" -print

find . -newer file.bak -type f -print

find . \( -name "~*" -or -name "temp*" \) -type f -prin

find . -perm 777 -- Найти все файлы с правами 777

find . -perm 777 | xargs rm -- Находим и удаляем все файлы с заданными правами

find ~ -name name.c | xargs chmod 777 -- Находим конкретный файл и меняем его права

-depth (или -d) Поиск в подкаталогах перед поиском в самом каталоге.

-L При поиске следовать по символическим ссылкам.

-maxdepth N При поиске проверять не более чем N вложенных уровней каталогов.

-mindepth N Не проверять вложенные каталоги уровня N и меньше.

-mount Не искать в каталогах других файловых систем.

. - каталог, откуда начинать поиск

* - любой набор символов

? - любой символ

Критерии поиска:

-name шаблон Имя файла (шаблон имени) без указания пути. Рекомендуется всегда заключать шаблон в кавычки.

-type C Файл типа C. Наиболее часто используемые значения для С: \

d — каталог, f — файл, l - символьная ссылка

Действия над файлами:

-exec команда \; Выполнить команду. Обратите внимание, что после команды ставится обратный слеш и точка с запятой.

print Вывод имени файла на экран.

-ls Выполнение команды ls -dils над текущим файлом.

http://pingvinus.ru/note/command-find

http://hashcode.ru/questions/95802/bash-список-файлов-в-каталоге-linux

grep - Поиск файлов или строки в файле по шаблону.

grep "шаблон поиска" "file_name"

-h Не выводит имя файла при поиске по нескольким файлам.

-r Поиск рекурсивно по всем файлам в указанной директории.

-l Выводит только имена файлов, в которых найдена строка. Если в файле есть несколько таких строк, то имя файла выводится только один раз.

Опция -q --quiet - silent Ничего не выдает на стандартный вывод.

Опция -s --no-messages

Примеры:

Поиск фалов в каталоге и во всех подкаталогах содержащих строку – «eval»

grep -i -n "eval" `find -name "*.php"`





galaxy