BashЯзык командного интерпретатора bash. Part 1. "Параметры"

Решил написать небольшой цикл постов о языке командного интерпретатора bash. Первый пост описывает параметры, используемые в командной оболочке bash.

Вместо переменных, которые используются в привычных нам языках программирования, в bash используется концепция параметров. Одним из главных критериев, описывающих параметры, являются имена параметров. Именем параметра может быть: слово, состоящее из латинских букв, цифр и знаков подчёркивания (в этом случае первым символом должна быть буква); число или один из следующих символов: *, @, #, ?, $, !, 0, _. Все параметры имеют строковый тип. Перед именем параметра следует ставить знак $, чтобы сослаться на его значение.
Параметры делятся на 3 группы:
— переменные оболочки;
— позиционные параметры;
— специальные параметры.
Теперь поговорим о каждой группе более подробно.

Переменные оболочки

С переменными оболочки можно проводить операции присваивания. Если значение переменной содержит специальные символы, их следует экранировать обратным слешем или кавычками:
$ param=”Hello, world!”
$ echo param #вывод имени параметра
param
$ echo $param #вывод значения параметра 
Hello, world!

Установленные таким образом переменные доступны только внутренним командам оболочки. А как же поступить, чтобы они были доступны и дочерним процессам? Их всего лишь нужно поместить в окружение bash с помощью команды export:
$ export PARAM=”Hello, world!” 

Теперь этот параметр будет доступен программам, запущенным из-под bash. Также упомяну, что param и PARAM не одна и та же переменная, а разные, так как регистр имеет значение. Так как переменная PARAM будет доступна дочерним процессам оболочки, то её можно назвать глобальной.
Можно выполнить следующие действия, чтобы почувствовать вышеописанную разницу:
1. Создайте пустой файл и сделайте вывод двух переменных param и PARAM. Например:
$ cat > script
echo Env variable: $PARAM
echo Local variable: $param

^D
$

Ctrl+D заканчивает ввод и закрывает файл.
2. Теперь сделайте наш скрипт исполняемым:
$ chmod a+x script

3. Определите переменную param и выполните скрипт:
$ param=”Hello, world (from local)”
$ echo $param
Hello, world (from local)
$ ./script
Env variable: Hello, world!
Local variable:
$

Когда оболочка bash начинает работу, она устанавливает для себя некоторые переменные окружения. Они используются дочерними процессами для установки какой-либо конкретной информации.
Приведу некоторые переменные окружения:
BASH_VERSION – версия командной оболочки;
USER – имя пользователя;
UID, EUID – реальные и эффективный userID
HOME – путь к домашнему каталогу пользователя;
HOSTNAME – имя компьютера;
HOSTTYPE – тип процессора компьютера;
OSTYPE – ОС;
HISTFILE – расположение истории команд;
HISTSIZE – размер истории команд;
LANG – язык текущего сеанса;
LINES – число строк на экране;
COLUMNS – число столбцов на экране;
PS1, PS2, PS3, PS4 – переменные, определяющие вид приглашения bash;
Для того, чтобы просмотреть значения всех текущих переменных текущего сеанса, необходимо выполнить команду set.
Если переменная больше не нужна, её можно разрегистрировать командой unset.
$ unset param

Позиционные параметры

Здесь я буду краток. Имя позиционного параметра представляет собой натуральное число, а значение – аргументы с соответствующими номерами, переданные сценарию или оболочке при их запуске (точкой отсчёта является 1, так как 0 используется одним из специальных параметров).

Специальные параметры

Имена специальных параметров представляет собой специальные символы, перечисленные ниже. Эти параметры исполняют роль шаблонных переменных, подстановку которых производит bash.
$0 – имя выполняемого сценария;
$# — количество позиционных параметров, переданных сценарию;
$_ — последний аргумент предыдущей из выполнявшихся команд;
$? – код завершения последней команды (0 – успешно, другое – ошибка);
$$ — PID текущего процесса;
$! – PID последнего асинхронного процесса;
$* — все позиционные параметры, собранные в одну строку («$1x$2x…$n»);
$@ — все позиционные параметры, подлежащие дальнейшему разбору («$1» «$2» …«$n»).

Оболочка bash позволяет организовать диалоговый ввод значения параметра с помощью команды read:
echo –n “Продолжить? (y/n): ”
read yesno
echo $yesno

Здесь команда read считывает значение, введённое пользователем в параметр yesno.
А что, если требуется ввести значение нескольких параметров в одну строку? Тогда необходимо после команды read вписать несколько имён параметров:
read name lastname

Если пользователь ввёл меньше значений, чем требовалось, тогда оставшимся параметрам будет присвоено пустое значение, а если больше – весь остаток строки будет присвоен последнему из перечисленных параметров.

Мой следующий пост охватит подстановки в оболочке bash и использование массивов. Но это только с тем условием, если вам понравится мой текущий пост. Надеюсь, информация была полезной и интересной :).

Комментарии (19)

  • avatar
  • Dez
  • 06 июля 2009, 23:46
  • #
  • 2
Автор хорошо поработал. Весьма информативно
Спасибо. Постараюсь следующий пост сделать таким же информативным.
Очень полезная статья. Тока вот еще один вопрос: при организации диалога с пользователем, как сделать так, чтобы был выбор «по умолчанию»? Т.е. при нажатии клавиши «Ввод» выбиралось дефолтное значение.
Ждем следующих постов:)
Как вариант, использовать if
read name
if [ "$name" ];
then echo $name;
else echo "anonymous";
fi

Еще довольно интересным может оказаться Advanced Bash-Scripting Guide, но не каждый его осилит :)
Проще так — одной строкой, без if'ов:
echo ${name=anonymous}

если переменная «name» заданна — выведется её значение, если нет то присвоится(и выведется) значение «anonymous».
у меня почему-то не сработало
":" добавь
# echo $name

# echo ${name:=anonymous}
anonymous
# echo $name
anonymous

Спасибо. Работает
Спасибо за отзыв :). Данного вопроса я хотел коснуться в своих последующих постах. Рассмотрение усравляющих структур будет в 3-м или 4-м топике этого цикла.
И еще один вопрос: есть ли какая-нибудь переменная буфера обмена?
Так можно скопировать «Hello world!» в буфер, из которого вставляется по клику на колесико.
echo 'Hello world!' | xclip

А так то же самое, но по Ctrl+V
echo 'Hello world!' | xsel -b
Всем очень рекомендую почитать Bash Pitfalls (на английском, на русском).
А вот сборник довольно редких, но полезных советов.
Спасибо за ссылки. Будет очень интересно ознакомиться.
Отличная статья! Дал автору и блогу кармы.
Bash я выучил уже давно, но такие статьи здесь очень нужны)
Благодарю.
Постараюсь развивать тему bash.
спасибо, как раз хотел выучить, да как-то руки не доходили.
побольше бы таких статей ^^
Спасибо автору, давно хотел выучить, только все дело не доходило. А так появился стимул! +1
Всегда пожалуйста. Второй топик по теме здесь.
Сегодня вечером будет третий.
+1
Как раз стимул чтобы начать изучать. Как всегда не доходили руки. :)
Сейчас буду читать остальные топики.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.