Набор команд можно объединять в отдельные файлы и вызывать этот файл вместо написания всех команд, такая опция нужна для большей модульности.
В Unix-среде принято называть такие файлы скриптами.
Напишем такой script.sh
:
#!/bin/sh
## файл script.sh
echo "Hi there"
Чтобы скрипт можно было исполнять нужно сделать несколько вещей.
Во-первых, в начале скрипта нужно указать два специальных символа (тут правильнее сказать: два байта) she-bang: #!
, а за ним путь к интерпретатору, с помощью которого нужно исполнить этот скрипт.
Без них операционная система не поймёт как выполнить код. А с ними запустит интерпретатор и передаст путь к файлу, который запускаем.
Да, интерпретатор может быть почти любым, не только shell
. См. Скрипты на других языках программирования.
В примере выше she-bang уже указан, скрипт будет интерпретироваться с помощью /bin/sh
.
Во-вторых, необходимо дать права на исполнения владельцу скрипта, т.е. по-умолчанию пользователю, от которого только что создали скрипт.
chmod u+x script.sh
Теперь скрипт можно исполнить отдельным процессом:
./script.sh
## вывод
Hi there
С помощью оператора && можно связать установку прав на исполнения и само исполнение в список:
chmod u+x script.sh && ./script.sh
## вывод
Hi there
Аргументы в shell-скриптах
В скрипт можно передать аргументы, они будут доступны по именам $1
, $2
, $3
и т.д.; скрипт завершается кодом возврата:
#!/usr/bin/env sh
## script.sh
echo $1
echo $2
echo $3
exit 10 # если код не 0
обязательно даём права на исполнение и передаём аргументы как в обычную программу:
chmod u+x script.sh
./script.sh "why braces?" '$1 $2 $3' three
echo $?
Выясните, что выводят команды выше:
## вывод
???
???
Что находится в переменных $0
и $@
?
Полезные утилиты при работе с аргументами
Скрипты на других языках программирования
Обратите внимание как используется shebang в примерах ниже.
Скрипты можно писать и на awk
и на sed
и на других языках.
Но существуют ограничения: можно вызвать интерпретатор только с одним аргументом. См. https://unix.stackexchange.com/questions/399690/multiple-arguments-in-shebang
Пример на Python
#!/usr/bin/env python3
import os
import sys
def list_files(directory):
try:
files = os.listdir(directory)
for file in files:
path = os.path.join(directory, file)
if os.path.isfile(path):
size = os.path.getsize(path)
print(f"{file}: {size} bytes")
except FileNotFoundError:
print(f"Directory not found: {directory}")
if __name__ == "__main__":
directory = sys.argv[1] if len(sys.argv) > 1 else '.'
list_files(directory)
Чтобы запустить
chmod +x list_files.py
а потом
./list_files.py /path/to/directory
Что скрипт делает, если в него не передали аргументы?
Пример на Perl
А вот пример на perl:
#!/usr/bin/perl
use strict;
use warnings;
sub count_lines {
my ($filename) = @_;
open(my $fh, '<', $filename) or die "Cannot open file $filename: $!";
my $count = 0;
$count++ while <$fh>;
close $fh;
return $count;
}
my $file = $ARGV[0] or die "Usage: $0 filename\n";
my $lines = count_lines($file);
print "$file has $lines lines\n";
аналогично нужно дать права на исполнения
chmod +x count_lines.pl
и можно исполнить так
./count_lines.pl filename.txt