Что такое командные файлы linux

sgww

В Linux, так же как и в операционных системах семейства Microsoft Windows можно создавать командный файл . которые содержат в себе набор команд интерпретатора shell. Такие файлы имеют свой синтаксис, который позволяет оперировать такими структурами как циклы и условия. Далее основы shell программирования linux на примере командной строки ubuntu 9.04 и интерпретатора bash.

Запишем в файл sample последовательность команд

$ cat sample
pwd
ls
echo The END

А теперь выполним эти команды

$ sh sample
/home/sgww
cpp file.txt mydaemon net_sh perl php sample
The END

Таков принцип .

Командный файл легко сделать исполняемым

$ chmod +x sample
$ /home/sgww/sample
/home/sgww
cpp file.txt mydaemon net_sh perl php sample
The END

$ cat sample
read x #вводим x
read y #вводим y
echo `expr $x ‘*’ $y + 7`

Всё что за знаком # это коментарий и интерпритатором не воспринимается
Не относится к оболочке csh!

$1, $2 . $9 — позволяют задавать аргументы командной строки для выполняемого файла

$ cat sample
echo the first parameter: $1
echo the second parametr: $2
echo the third parameter: $3
ls $1 $2 $3

$ /home/sgww/sample -l -s -r
the first parameter: -l
the second parametr: -s
the third parameter: -rtotal 28
4 -rwxr-xr-x 1 sgww sgww 100 Mar 2 11:19 sample
4 drwxr-xr-x 2 sgww sgww 4096 Dec 15 16:52 php
4 drwxr-xr-x 2 sgww sgww 4096 Feb 1 15:39 perl
4 -rw-r—r— 1 sgww sgww 79 Mar 1 16:16 net_sh
4 drwxr-xr-x 2 sgww sgww 4096 Feb 1 17:15 mydaemon
4 -rw-r—r— 1 sgww sgww 56 Mar 1 17:18 file.txt
drwxr-xr-x 2 sgww sgww 4096 Feb 1 17:15 cpp

$# — задает общее количество параметров с которым вызывается командный файл

$ cat sample
echo total parameters are: $#
$ sample param1 param2 param3
total parameters are: 3

$* — содержит сразу все параметры

$ cat sample
echo total parameters are: $*
$ sample All parameters are in this variable
total parameters are: All parameters are in this variable

Имя переменной может начинаться с буквы или символа подчереркивания
знак равенства(=) это оператор присваиивания

_var=1
_word =slovo
value=»t ak aia dli nna iain epo niat naia str oka»

Тип данных переменных shell это всегда строка символов!

$ cat sample
_string=»Hello from Perm»
echo $_string
$ /home/sgww/sample
Hello from Perm

результат выполения команды в переменную (команда обрамляется обратными апострофами)

$cat sample
_date=`date`
echo $_date
$/home/sgww/sample
Tue Mar 2 11:41:30 YEKT 201

ввод значения переменной в консоли

$ cat sample
echo Enter data:
read data1
read data2
echo Your data: $data1 and $data2
$ /home/sgww/sample
Enter data:
Linux
Windows
Your data: Linux and Windows

Системные переменные

$ cat sample
echo $PATH
echo $HOME
echo $MAIL
echo $SHELL
$ /home/sgww/sample
/usr/local/bin:/usr/bin:/bin:/usr/bin/X1 1:/usr/games
/home/sgww
/var/mail/sgww
/bin/bash

PATH — пути поиска исполняемых файло (так как каталога /home/sgww/ там нет, постояно приходилось писать полный путь /home/sgww/sample для выполнения команды)
HOME — домашний каталог
MAIL — файл электронной почты
SHELL — оболочка в которой работаем

Добавим к переменной PATH каталог HOME что бы не приходилось постоянно писать полный путь

$ cat sample
PATH=$PATH:$HOME

Эти строки следует добавить в ~/.profile или ~/.bash_profile
теперь нет необходимости писать полный путь до команды

Специальные символы

* — любая последовательность, любых символов
? — один любой символ
[. ] — любой из символов диапазона

Читайте также:  Посмотреть разрешение экрана линукс

$echo *
cpp file.txt mydaemon net_sh perl php sample
$ echo «*»
*

$ cat sample
text=»This is a text»
echo ‘$text’
$ sample
$text

$ cat sample
text=»This is a text»
echo \$text
$ sample
$text

$ cat sample
text=`pwd`
echo $text
$ sample
/home/sgww

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

Для выполнения арифметических операций в командном файле понадобиться команда expr

$ expr 7 + 96
103
$ expr 87 — 555
-468
$ expr 18 / 2
9
$ expr 19 / 2
9
$ expr 19 % 2
1
$ expr 6 \* 32
192
$ expr 6 ‘*’ 32
192
$ expr 6 * 32
expr: syntax error

Если при умножении не поставить \ или » то * будет восприниматься как любой символ

Стоит отметить, что \ — это не деление, а целая часть от деления, операция % дает остаток от деления

Переменные окружения, команда export и unset

Для взаимодейстивя с другими процессами могут пригодияться переменные окружения

Их полный списко можно посмотреть командой export

$ export
declare -x HISTCONTROL=»ignoreboth»
declare -x HOME=»/home/sgww»
declare -x LESSCLOSE=»/usr/bin/lesspipe %s %s»
declare -x LESSOPEN=»| /usr/bin/lesspipe %s»
declare -x LOGNAME=»sgww»
.

$ name=Pavel && export name
$ echo $name
Pavel

Для составления условных выражений оператора if очень полезна программа test.

$ cat sample
if test -r sample
then
echo True
else
echo False
fi
$ sample
True

В этом примере test -r sample — это условие
echo True выполняется если условие истино
echo False если ложно

Программа test предназначена для проверки типов файлов и сравнения значений

$test -r file # Истино если файл file существует и доступен для чтения
$test -w file # Истино если файл file существует и доступен для записи
$test -x file # Истино если файл file существует и доступен для выполнения

$ x=32 && export x
$ y=32 && export y

$test $x -eq $y # Истино если $x равен $y
$test $x -en $y # Истино если $x не равен $y
$test $x -ge $y # Истино если $x больше или равен $y
$test $x -gt $y # Истино если $x больше $y
$test $x -le $y # Истино если $x меньше или равен $y
$test $x -lt $y # Истино если $x меньше $y

Остальные параметры можно посмотреть в man test

$ cat sample
for x in 1 two 3
do
echo $x
done
$ sample
1
two
3

В этом цикле код между do и done выполниться 3 раза, при этом первый раз
x=1, второй раз x=two и последний x=3

$ cat sample
for x in *
do
echo $x
done
$ sample
cpp
demo
file.txt
mydaemon
net_sh
perl
php
sample

* в списке переменных цикла, заставляет for использовать в качестве значения $x элементы текущего каталога

Циклы WHILE и UNTIL

$ cat sample
while test -r file
do
sleep 10
echo file exists
done
echo file does not exist

$ touch file
$ sample
file exists
file exists
Ctr+Z
[1]+ Stopped sample
$ rm file
$ fg
sample
file exists
file does not exist

$ cat sample
until test -r file
do
sleep 5
echo file does not exist
done
echo file exists
$ sample
file does not exist
file does not exist
Ctr+Z
[1]+ Stopped sample
$ touch file
$ fg
sample
file does not exist
file exists
$

Источник

2. Командные файлы в Linux.

Для того чтобы текстовый файл можно было использовать как командный, существует несколько возможностей.

Пусть с помощью редактора создан файл с именем f1, содержащий одну строку следующего вида: date; pwd; ls. Можно вызвать оболочку shell как команду, обозначаемую sh, и передать ей файл fl, как аргумент или как перенаправленный вход: $ sh fl или $ sh < fl. В результате выполнения любой из этих команд будет выдана дата, затем имя текущего каталога, а потом содержимое каталога.

Читайте также:  Изменение мандатной метки astra linux

Файл можно выполнить и в текущем экземпляре shell. Для этого существует специфическая команда . (точка): .fl.

Более удобный вариант работы с командным файлом — это превращение его в выполняемый файл, т.е. просто сделать его командой (запускающей этот файл по его названию), что достигается изменением кода защиты. Для этого надо разрешить выполнение этого файла. Например, chmod 711 fl сделает у этого файла код защиты «rwx—x—x». Тогда простой вызов fl приведет к выполнению тех же трех команд, которые были записаны в файл.

Результат будет тот же, если файл с содержимым date; pwd; ls будет представлен в виде:

так как переход на другую строку также является разделителем в последовательности команд.

Начинать командный файл надо всегда с пустой строки или пустого оператора «:». Их выполнение происходит в режиме интерпретации с помощью shell-интерпретатора.

Работу всех команд операционной системы упрощенно можно представить следующим образом: команда — это некоторое устройство, которое выполняет преобразование входного потока в выходной.

Входной поток в команде может быть задан четырьмя способами: указанием адреса входного потока справа от команды; отсутствием в команде прямого указания на адрес входного потока; перенаправлением входного потока с помощью символа «

Выходной поток может быть задан пятью способами: по умолчанию, без явного указания на выходной поток; явным указанием выходного потока; перенаправлением выходного потока одной команды на вход другой (символ |); перенаправлением в начало файла (символ «>»); перенаправлением в конец файла (символ «>>»).

Выходной поток одной команды может быть направлен во входной поток другой команды посредством организации конвейера команд. Для создания конвейера команд между объединяемыми командами ставится знак |.

Для вывода всех файлов текущего каталога на экран служит команда ls -1. Для ограничения выходного потока этой команды, вывода каталога отдельными фрагментами, служит команда more. Соединив эти две команды в конвейер ls –l| more получим, что содержимое текущего каталога готовится командой ls -l, выходной поток которой знаком конвейера | направлен на вход команды more. А команда more выводит информацию на экран с временными паузами.

Другие команды при соединении в конвейер позволяют получать результат, который каждая команда в отдельности получить не позволит. Примеры:

Показать общее количество файлов в текущем каталоге: ls –l| wc –l.

Показать общее количество пользователей, работающих в данный момент на ЭВМ: who | we –l.

Показать последние 10 раз, когда заходил в систему пользователь с текущим login’ом «vasjkov»: last vasjkov | head.

Отсортировать список файлов по алфавиту, подготовить его к печати и отпечатать его: sort list | pr | lpr.

Показать состав работающих на ЭВМ пользователей в алфавитном порядке: who | sort.

Достать страницу из справочной системы shell и отправить ее по почте Алексею Васькову: man sh | mail vasjkov.

Сформировать список содержимого текущего каталога, выделить размер каждого файла из списка, список отсортировать по цифрам, показать только последний (а следовательно, наибольший) файл из списка: ls -l | awk ‘ ‘ | sort -n | tail –l.

Читайте также:  Airmon ng linux mint

Файл «textfile» отсортировать и напечатать: sort textfile | lp.

Найти в текущем каталоге файлы, имена которых заканчиваются на 1994, найти в этих файлах слово «profits» и напечатать строки, содержащие это слово. Поиск требуемого слова в файлах произвести командой grep: cat *. 1994 | grep profits | lp.

Выдать на экран список файлов текущего каталога (команда list) в 4 колонки (опция -4 команды рг) по 5 строк на странице (опция -l5) и не выдавать заголовок списка и конечное сообщение (опция -t): ls | pr -t -l5 -4.

Сформировать список файлов текущего каталога, преобразовать его в 3 колонки и распечатать: ls | pr -3 | lpr.

Файл «fruits» отсортировать и вывести на экран колонками, как при табуляции: sort fruits | sp.

Определить, кто входит в систему с терминала ttyl5: who |grep ttyl5.

Вывести неповторяющийся список элементов файла animals с указанием числа повторений этих элементов. Такой способностью обладает команда uniq с опцией -с: sort animals | uniq -с.

Найти в телефонном справочнике phone.lst абонента по двум критериям поиска: Тэд, живущий в Лос Анжелесе: grep Ted phone.lst | grep ‘Los Angeles’.

Отформатировать текст из файла text_5 в 2 колонки перед выводом на печать: рr -2 text_5 | lpr.

Перед печатью файл data_15 сначала упорядочить, затем разделить на страницы: sort data 15 | pr | lpr.

Источник

How do I create a batch file and run it? [duplicate]

Your question is more likely to receive useful answers if it contains some specifics. Such as what type of data is to be processed, including realistic examples of input and output.

@SergiyKolodyazhnyy The duplicate nominee is closed as too broad. As such the close vote on this one should be «too broad» as well. That said it seems like a reasonable question to me as I was once in the dark myself 🙂

@WinEunuuchs2Unix It is closed but does have an accepted answer, which will give OP what they want, or at least a starting point.

@EliahKagan If a mod agrees perhaps he can reopen that one and then merge the answers from here to there?

@WinEunuuchs2Unix That question, which this received close votes to be duped to, was actually reopened a few hours ago, then closed again as duplicate of that highly voted question. Both of them are listed as «originals» in the duplicate banner here (i.e., this question is duped to both of them). So if answers are to be merged, they’d probably be put there. Do you think that would be useful?

3 Answers 3

To create one use the .sh extension but it doesn’t really matter but it helps future users to quickly determine which file type it is. The bat name is mostly used on Windows but in Linux file name extensions do not really matter. Meaning I can call my file say run.de and it would still run in bash file but I believe it’s a good practice to name them with the .sh file extension.

For the editor, part uses any that is best for you between nano vim gedit emacs , but I believe gedit would be nice to start with.

Источник

Оцените статью
Adblock
detector