Чтение онлайн

на главную - закладки

Жанры

Командная строка Linux
Шрифт:

Обработка позиционных параметров скопом

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

Для этой цели командная

оболочка предоставляет два специальных параметра. Они оба замещаются полным списком позиционных параметров, но имеют некоторые тонкие отличия. Описание этих параметров приводится в табл. 32.1.

Таблица 32.1. Специальные параметры $* и $@

Параметр

Описание

$*

Замещается списком позиционных параметров, начиная с $1. Если имя параметра $* заключить в двойные кавычки, позиционные параметры будут перечислены в списке через первый символ в переменной IFS (по умолчанию пробел), а сам список будет размещен в одной строке и заключен в кавычки

$@

Замещается списком позиционных параметров, начиная с $1. Если имя параметра $@ заключить в двойные кавычки, механизм подстановки заменит его списком позиционных параметров, заключенных в кавычки по отдельности

Следующий сценарий демонстрирует, как действуют эти специальные параметры:

#!/bin/bash

# posit-params3 : сценарий для демонстрации $* и $@

print_params {

echo "\$1 = $1"

echo "\$2 = $2"

echo "\$3 = $3"

echo "\$4 = $4"

}

pass_params {

echo -e "\n" '$* :'; print_params $*

echo -e "\n" '"$*" :'; print_params "$*"

echo -e "\n" '$@ :'; print_params $@

echo -e "\n" '"$@" :'; print_params "$@"

}

pass_params "word" "words with spaces"

В этой довольно замысловатой программе мы создали два аргумента, word и words with spaces, и передали их функции pass_params. Эта функция, в свою очередь, передает их функции print_params, с применением каждого из четырех методов, доступных для специальных параметров $* и $@. Вывод сценария показывает разницу между ними:

[me@linuxbox ~]$ posit-param3

$* :

$1 = word

$2 = words

$3 = with

$4 = spaces

"$*" :

$1 = word words with spaces

$2 =

$3 =

$4 =

$@ :

$1 = word

$2 = words

$3 = with

$4 = spaces

"$@" :

$1 = word

$2 = words with spaces

$3 =

$4 =

В данном примере оба параметра, $* и $@, возвращают результат из четырех слов: word, words, with и spaces. "$*" возвращает результат в виде одного слова, содержащего пробелы: word words with spaces. "$@" возвращает

результат в виде двух слов, второе из которых включает пробелы: word и words with spaces.

Это соответствует нашим фактическим намерениям. Этот пример показывает, что, несмотря на наличие четырех разных способов получения списка позиционных параметров, в большинстве ситуаций предпочтительнее использовать прием с "$@", потому что он сохраняет целостность каждого позиционного параметра.

Более сложное приложение

После долгой паузы мы продолжим работу над программой sys_info_page. Теперь мы добавим в нее поддержку нескольких параметров командной строки:

• Выходной файл. Мы добавим параметр, который позволит указать имя файла для вывода результатов работы программы. Сделать это можно будет с помощью -f файл или --file файл.

• Интерактивный режим. При передаче этого параметра программа будет предлагать пользователю ввести имя выходного файла и определять, существует ли этот файл. Если файл существует, пользователю будет предложено подтвердить свое решение, прежде чем затереть существующий файл. Этот параметр можно будет передать как -i или --interactive.

• Справка. Передав параметр -h или --help, можно потребовать от программы вывести сообщение с информацией о правилах пользования программой.

Далее приводится код, реализующий обработку командной строки:

usage {

echo "$PROGNAME: usage: $PROGNAME [-f file | -i]"

return

}

# обработка параметров командной строки

interactive=

filename=

while [[ -n $1 ]]; do

case $1 in

– f | --file) shift

filename=$1

;;

– i | --interactive) interactive=1

;;

– h | --help) usage

exit

;;

*) usage >&2

exit 1

;;

esac

shift

done

Сначала мы добавили функцию usage для вывода сообщения, если программа вызывается с параметром --help или с неизвестным параметром.

Затем следует цикл обработки параметров. Цикл продолжается, пока позиционный параметр $1 не получит пустое значение. В конце цикла вызывается команда shift, чтобы сдвинуть позиционные параметры и, в конечном итоге, гарантировать завершение цикла.

Внутри цикла инструкция case проверяет текущий позиционный параметр на соответствие поддерживаемым вариантам. Если данный параметр поддерживается, выполняется соответствующая операция, если нет — выводится сообщение с информацией о правилах пользования программой и сценарий завершается с признаком ошибки.

Поделиться:
Популярные книги

Кротовский, побойтесь бога

Парсиев Дмитрий
6. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кротовский, побойтесь бога

Конь Рыжий

Москвитина Полина Дмитриевна
2. Сказания о людях тайги
Проза:
историческая проза
8.75
рейтинг книги
Конь Рыжий

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Стратегия обмана. Трилогия

Ванина Антонина
Фантастика:
боевая фантастика
5.00
рейтинг книги
Стратегия обмана. Трилогия

Новые горизонты

Лисина Александра
5. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Новые горизонты

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Кто ты, моя королева

Островская Ольга
Любовные романы:
любовно-фантастические романы
7.67
рейтинг книги
Кто ты, моя королева

Блуждающие огни 2

Панченко Андрей Алексеевич
2. Блуждающие огни
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Блуждающие огни 2

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Барону наплевать на правила

Ренгач Евгений
7. Закон сильного
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Барону наплевать на правила

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Отдельный танковый

Берг Александр Анатольевич
1. Антиблицкриг
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Отдельный танковый