Эти команды могут оказаться весьма полезными, когда в сценарии нужно производить частую смену каталогов, но при этом не хочется жестко "зашивать" имена каталогов. Обратите внимание: содержимое стека каталогов постоянно хранится в переменной-массиве -- $DIRSTACK.
Пример 11-7. Смена текущего каталога
# Команда 'dirs' будет вызвана автоматически (на stdout будет выведено содержимое стека).
echo "Выполнен переход в каталог `pwd`." # Обратные одиночные кавычки.
# Теперь можно выполнить какие либо действия в каталоге 'dir1'.
echo "Выполнен переход в каталог `pwd`."
# Теперь можно выполнить какие либо действия в каталоге 'dir2'.
echo "На вершине стека находится: $DIRSTACK."
echo "Возврат в каталог `pwd`."
# Теперь можно выполнить какие либо действия в каталоге 'dir1'.
echo "Возврат в первоначальный рабочий каталог `pwd`."
Команда let производит арифметические операции над переменными. В большинстве случаев, ее можно считать упрощенным вариантом команды expr.
Пример 11-8. Команда let, арифметические операции.
let a=11 # То же, что и 'a=11'
let a=a+5 # Эквивалентно "a = a + 5"
# (Двойные кавычки и дополнительные пробелы делают код более удобочитаемым)
let "a <<= 3" # Эквивалентно let "a = a << 3"
echo "\"\$a\" (=16) после сдвига влево на 3 разряда = $a"
let "a /= 4" # Эквивалентно let "a = a / 4"
let "a -= 5" # Эквивалентно let "a = a - 5"
let "a = a * 10" # Эквивалентно let "a = a * 10"
let "a %= 8" # Эквивалентно let "a = a % 8"
echo "270 mod 8 = $a (270 / 8 = 33, остаток = $a)"
eval arg1 [arg2] ... [argN]
Транслирует список аргументов, из списка, в команды.
Пример 11-9. Демонстрация команды eval
y=`eval ls -l` # Подобно y=`ls -l`
echo $y # но символы перевода строки не выводятся, поскольку имя переменной не в кавычках.
echo "$y" # Если имя переменной записать в кавычках -- символы перевода строки сохраняются.
y=`eval df` # Аналогично y=`df`
echo $y # но без символов перевода строки.
# Когда производится подавление вывода символов LF (перевод строки), то анализ
#+ результатов различными утилитами, такими как awk, можно сделать проще.
Пример 11-10. Принудительное завершение сеанса
y=`eval ps ax | sed -n '/ppp/p' | awk '{ print $1 }'`
# Выяснить PID процесса 'ppp'.
kill -9 $y # "Прихлопнуть" его
# Предыдущие строки можно заменить одной строкой
# kill -9 `ps ax | awk '/ppp/ { print $1 }'
# Завершенный, по сигналу SIGKILL, ppp изменяет права доступа