Искусство программирования на языке сценариев командной оболочки
Шрифт:
[взято из упоминавшегося ранее примера]
Команда cd с ключом – P (physical) игнорирует символические ссылки.
Команда "cd -" выполняет переход в каталог $OLDPWD -- предыдущий рабочий каталог.
bash$ cd //
bash$ pwd
//
Само
pwd
Выводит название текущего рабочего каталога (Print Working Directory) (см. Пример 11-7). Кроме того, имя текущего каталога хранится во внутренней переменной $PWD.
pushd, popd, dirs
Этот набор команд является составной частью механизма "закладок" на каталоги и позволяет перемещаться по каталогам вперед и назад в заданном порядке. Для хранения имен каталогов используется стек (LIFO -- "последний вошел, первый вышел").
pushd dir-name– - помещает имя текущего каталога в стек и осуществляет переход в каталог dir-name.
popd– - выталкивает, находящееся на вершине стека, имя каталога и одновременно осуществляет переход в каталог, оказавшийся на врешине стека.
dirs– - выводит содержимое стека каталогов (сравните с переменной $DIRSTACK). В случае успеха, обе команды -- pushd и popd автоматически вызывают dirs.
Эти команды могут оказаться весьма полезными, когда в сценарии нужно производить частую смену каталогов, но при этом не хочется жестко "зашивать" имена каталогов. Обратите внимание: содержимое стека каталогов постоянно хранится в переменной-массиве -- $DIRSTACK.
Пример 11-7. Смена текущего каталога
#!/bin/bash
dir1=/usr/local
dir2=/var/spool
pushd $dir1
# Команда 'dirs' будет вызвана автоматически (на stdout будет выведено содержимое стека).
echo "Выполнен переход в каталог `pwd`." # Обратные одиночные кавычки.
# Теперь можно выполнить какие либо действия в каталоге 'dir1'.
pushd $dir2
echo "Выполнен переход в каталог `pwd`."
# Теперь можно выполнить какие либо действия в каталоге 'dir2'.
echo "На вершине стека находится: $DIRSTACK."
popd
echo "Возврат в каталог `pwd`."
# Теперь можно выполнить какие либо действия в каталоге 'dir1'.
popd
echo "Возврат в первоначальный рабочий каталог `pwd`."
exit 0
Переменные
let
Команда let
производит арифметические операции над переменными. В большинстве случаев, ее можно считать упрощенным вариантом команды expr.Пример 11-8. Команда let, арифметические операции.
#!/bin/bash
echo
let a=11 # То же, что и 'a=11'
let a=a+5 # Эквивалентно "a = a + 5"
# (Двойные кавычки и дополнительные пробелы делают код более удобочитаемым)
echo "11 + 5 = $a"
let "a <<= 3" # Эквивалентно let "a = a << 3"
echo "\"\$a\" (=16) после сдвига влево на 3 разряда = $a"
let "a /= 4" # Эквивалентно let "a = a / 4"
echo "128 / 4 = $a"
let "a -= 5" # Эквивалентно let "a = a - 5"
echo "32 - 5 = $a"
let "a = a * 10" # Эквивалентно let "a = a * 10"
echo "27 * 10 = $a"
let "a %= 8" # Эквивалентно let "a = a % 8"
echo "270 mod 8 = $a (270 / 8 = 33, остаток = $a)"
echo
exit 0
eval
eval arg1 [arg2] ... [argN]
Транслирует список аргументов, из списка, в команды.
Пример 11-9. Демонстрация команды eval
#!/bin/bash
y=`eval ls -l` # Подобно y=`ls -l`
echo $y # но символы перевода строки не выводятся, поскольку имя переменной не в кавычках.
echo
echo "$y" # Если имя переменной записать в кавычках -- символы перевода строки сохраняются.
echo; echo
y=`eval df` # Аналогично y=`df`
echo $y # но без символов перевода строки.
# Когда производится подавление вывода символов LF (перевод строки), то анализ
#+ результатов различными утилитами, такими как awk, можно сделать проще.
exit 0