Параметры и переменные
Формально параметры включают в себя аргументы, передаваемые программе (т.е. позиционные параметры), специальные переменные оболочки вроде $#
и $?
, а также обыкновенные переменные, называемые также ключевыми параметрами.
Позиционным параметрам нельзя присваивать значения непосредственно, хотя с помощью команды set
можно переназначать их значения. Для присваивания значений переменным служит форма:
переменная=значение переменная=значение …
Например, присвоим значения трем переменным:
$ x=50 y=100 z=200 $ echo $x $y $z 50 100 200
Подстановка значений переменных
В простейшей форме для подстановки значения переменной ее имя предваряется знаком $, например $var
или $2
.
Конструкция ${переменная}
Для избежания возможного конфликта из-за символов после имени переменной, последние можно заключать в фигурные скобки:
$ mv $file ${file}bak
Конструкция ${переменная:-значение}
Конструкция предписывает использовать значение указанной переменной
, если оно не является пустым, а иначе — подставить заданное значение
:
$ echo Using editor ${EDITOR:-/bin/vi}
Это все равно, что написать:
if [ -n "$EDITOR" ] ; then
echo Using editor $EDITOR
else
echo Using editor /bin/vi
fi
Конструкция ${переменная:=значение}
Эта конструкция подобна предыдущей, но если заданная переменная
имеет пустое значение, то указанное значение
не только используется, но и присваивается заданной переменной
:
${PHONEBOOK:$HOME/phonebook.txt}
Следует, однако, иметь ввиду, что приведенную выше конструкцию нельзя применять в качестве отдельной команды. Ведь после произведенной подстановки оболочка попытается выполнить результат такой подстановки как команду. Чтобы воспользоваться данной конструкцией как отдельной командой, надо написать:
$ : ${PHONEBOOK:$HOME/phonebook.txt}
Оболочка по-прежнему выполнит подстановку, но ничего не выполнит, поскольку указана пустая команда.
$ PHONEBOOK= $ echo $PHONEBOOK $ : ${PHONEBOOK:$HOME/phonebook.txt} $ echo $PHONEBOOK /home/evgeniy/phonebook.txt
Конструкция ${переменная:?значение}
Если в этой конструкции заданная переменная
имеет непустое значение, то оболочка подставит его. В противном случае оболочка направит указанное значение
в стандартный вывод ошибок и на этом завершит свое выполнение. Но это не означает выход из системы, если данная конструкция была выполнена в исходной оболочке.
Конструкция ${переменная:+значение}
В данной конструкции указанное значение
подставляется, если заданная переменная
имеет непустое значение, а иначе вообще ничего не подставляется.
В той части любой из рассматриваемых здесь конструкций, где указывается значение
, может быть подставлена команда, поскольку она выполняется только в том случае, если требуется ее значение:
WORKDIR=${DBDIR:-$(pwd)}
В данном примере переменной WORKDIR
присаивается значение параметра DBDIR
, если оно непустое. В противном случае выполняется команда pwd
, а результат присваивается переменной WORKDIR
. Таким образом, команда pwd
выполняется лишь в том случае, если значение параметра DBDIR
оказывается пустым.
Команда set
Служит двум целям: для установки различных параметров оболочки и переназначения позиционных параметров $1
, $2
и т.п.
Опция -x
команды set
позволяет включить режим трассировки. Если в исходном коде сценария добавить команду
set -x
то данные обо всех выполняемых далее командах будут направлены оболочкой в стандартный вывод ошибок после имени файла, переменной и подстановки команд. Имена трассируемых команд предваряются знаками «плюс».
$ list=* $ set -x $ echo $list + echo phonebook.txt unix.txt linux.txt phonebook.txt unix.txt linux.txt $ cmd=wc + cmd=wc cmd=wc $ ls | $cmd -l + ls + wc -l 3
Для выключения режима трассировки, надо в код сценария добавить команду
set +x
В исходном коде сценария можно указать любое количество команд set -x
и set +x
, чтобы включать и выключать режим трассировки по мере надобности.
Еще один способ включить режим трассировки — запуск подоболочки с параметром -x
, благодаря которому весь сценарий будет запущен в отладочном режиме
$ bash -x backup.sh
set
без параметров, будет получен список всех переменных (локальных или экспортируемых), существующих в текущей среде.
Переназначение позиционных параметров
$ set one two three four $ echo $1:$2:$3:$4 one:two:three:four $ echo $# 4 $ echo $* one two three four $ for arg; do echo $arg; done one two three four