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

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

Жанры

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

#!/bin/bash

# posit-param: сценарий для просмотра параметров командной строки

echo "

\$0 = $0

\$1 = $1

\$2 = $2

\$3 = $3

\$4 = $4

\$5 = $5

\$6 = $6

\$7 = $7

\$8 = $8

\$9 = $9

"

Этот очень простой сценарий выводит значения переменных с именами от $0 до $9. Запустим его без аргументов командной строки:

[me@linuxbox ~]$ posit-param

$0 = /home/me/bin/posit-param

$1 =

$2 =

$3 =

$4 =

$5 =

$6 =

$7 =

$8 =

$9 =

Даже

в отсутствие аргументов переменная $0 всегда содержит первый элемент командной строки — путь к файлу выполняемой программы. Давайте передадим сценарию несколько аргументов:

[me@linuxbox ~]$ posit-param a b c d

$0 = /home/me/bin/posit-param

$1 = a

$2 = b

$3 = c

$4 = d

$5 =

$6 =

$7 =

$8 =

$9 =

ПРИМЕЧАНИЕ

В действительности, если использовать механизм подстановки параметров, можно получить доступ более чем к девяти параметрам. Чтобы указать число больше девяти, следует заключить его в фигурные скобки; например, ${10}, ${55}, ${211} и т.д.

Определение числа аргументов

Командная оболочка поддерживает также переменную $#, хранящую число аргументов командной строки:

#!/bin/bash

# posit-param: сценарий для просмотра параметров командной строки

echo "

Number of arguments: $#

\$0 = $0

\$1 = $1

\$2 = $2

\$3 = $3

\$4 = $4

\$5 = $5

\$6 = $6

\$7 = $7

\$8 = $8

\$9 = $9

"

Результат:

[me@linuxbox ~]$ posit-param a b c d

Number of arguments: 4

$0 = /home/me/bin/posit-param

$1 = a

$2 = b

$3 = c

$4 = d

$5 =

$6 =

$7 =

$8 =

$9 =

shift — доступ к множеству аргументов

Но как быть, если программе передается большое число аргументов, как в следующем примере:

[me@linuxbox ~]$ posit-param *

Number of arguments: 82

$0 = /home/me/bin/posit-param

$1 = addresses.ldif

$2 = bin

$3 = bookmarks.html

$4 = debian-500-i386-netinst.iso

$5 = debian-500-i386-netinst.jigdo

$6 = debian-500-i386-netinst.template

$7 = debian-cd_info.tar.gz

$8 = Desktop

$9 = dirlist-bin.txt

В системе, где выполнялся этот пример, механизм подстановки развернул символ * в 82 аргумента. Как обработать такое количество? Командная оболочка предусматривает решение и для подобных случаев, правда, следует отметить, что изяществом оно не отличается. Команда shift выполняет «сдвиг» параметров к началу списка. Фактически, используя shift, можно обойтись единственной переменной-параметром (помимо $0, которая никогда не изменяется).

#!/bin/bash

# posit-param2: сценарий вывода всех аргументов

count=1

while [[ $# -gt 0 ]]; do

echo "Argument $count = $1"

count=$((count + 1))

shift

done

Каждый раз, когда выполняется команда shift, значение $2 перемещается в $1, значение $3

перемещается в $2 и т.д. Значение $# при этом уменьшается на 1.

В программе posit-param2 мы создали цикл, проверяющий число оставшихся аргументов и продолжающийся до тех пор, пока оно не уменьшится до нуля. Цикл выводит текущий аргумент, в каждой итерации увеличивает счетчик обработанных аргументов count и, наконец, выполняет shift, чтобы загрузить в $1 следующий аргумент. Вот как работает эта программа:

[me@linuxbox ~]$ posit-param2 a b c d

Argument 1 = a

Argument 2 = b

Argument 3 = c

Argument 4 = d

Простые приложения

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

#!/bin/bash

# file_info: простая программа получения информации о файле

PROGNAME=$(basename $0)

if [[ -e $1 ]]; then

echo -e "\nFile Type:"

file $1

echo -e "\nFile Status:"

stat $1

else

echo "$PROGNAME: usage: $PROGNAME file" >&2

exit 1

fi

Эта программа выводит тип указанного файла (определяется с помощью команды file) и его состояние (командой stat). Интересной особенностью программы является переменная PROGNAME. Ей присваивается результат выполнения команды basename $0. Команда basename удаляет начальную часть из пути к файлу, оставляя только базовое имя. В данном примере basename удалит начальную часть из параметра $0, хранящего полный путь к данной программе. Такой результат удобно использовать для конструирования сообщений, например, о правилах использования программы. При подобном подходе можно переименовать сценарий, и при выводе сообщений новое имя программы будет использоваться автоматически.

Использование позиционных параметров в функциях

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

file_info {

# file_info: функция для вывода информации о файле

if [[ -e $1 ]]; then

echo -e "\nFile Type:"

file $1

echo -e "\nFile Status:"

stat $1

else

echo "$FUNCNAME: usage: $FUNCNAME file" >&2

return 1

fi

}

Теперь, если сценарий, включающий функцию file_info, вызовет ее с именем файла в аргументе, аргумент будет передан в функцию.

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

Обратите внимание, что в этом примере вместо переменной PROGNAME используется переменная командной оболочки FUNCNAME. Оболочка автоматически присваивает значение этой переменной в момент вызова функции. Отметьте также, что $0 всегда содержит полный путь к первому элементу командной строки (то есть имя программы), а не имя функции, как можно было бы ожидать.

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

Бальмануг. Невеста

Лашина Полина
5. Мир Десяти
Фантастика:
юмористическое фэнтези
5.00
рейтинг книги
Бальмануг. Невеста

Егерь

Астахов Евгений Евгеньевич
1. Сопряжение
Фантастика:
боевая фантастика
попаданцы
рпг
7.00
рейтинг книги
Егерь

Мастер 8

Чащин Валерий
8. Мастер
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Мастер 8

Секретарша генерального

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
8.46
рейтинг книги
Секретарша генерального

Феномен

Поселягин Владимир Геннадьевич
2. Уникум
Фантастика:
боевая фантастика
6.50
рейтинг книги
Феномен

Эра Мангуста. Том 2

Третьяков Андрей
2. Рос: Мангуст
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эра Мангуста. Том 2

Имперец. Том 1 и Том 2

Романов Михаил Яковлевич
1. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 1 и Том 2

Ты не мой Boy 2

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

Право налево

Зика Натаэль
Любовные романы:
современные любовные романы
8.38
рейтинг книги
Право налево

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Идеальный мир для Лекаря 21

Сапфир Олег
21. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 21

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия