Набор команд можно объединять в отдельные файлы и вызывать этот файл вместо написания всех команд, такая опция нужна для большей модульности.

В 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