Основы программирования в Linux
Вы можете объявлять локальные переменные в функциях командной оболочки с помощью ключевого слова
. В этом случае переменная действительна только в пределах функции. В других случаях функция может обращаться к переменным командной оболочки, у которых глобальная область действия. Если у локальной переменной то же имя, что и у глобальной, в пределах функции локальная переменная перекрывает глобальную. Для того чтобы убедиться в этом на практике, можно изменить предыдущий сценарий следующим образом.local#!/bin/sh<i>sample_text="global variable" </i>foo() {local sample_text="local variable"echo "Function foo is executing"<i> echo $sample_text</i>}echo "script starting"<i>echo $sample_text</i>fooecho "script ended"<i>echo $sample_text</i>exit 0При отсутствии команды
, задающей возвращаемое значение, функция возвращает статус завершения последней выполненной команды,returnУпражнение 2.12. Возврат значенияВ следующем сценарии, my_name, показано, как в функцию передаются параметры и как функции могут вернуть логический результат
илиtrue. Вы можете вызвать этот сценарий с параметром, задающим имя, которое вы хотите использовать в вопросе.false1. После заголовка командной оболочки определите функцию
.yes_or_no#!/bin/shyes_or_no() {echo "Is your name $* ? "while truedoecho -n "Enter yes or no: "read xcase "$x" iny | yes ) return 0;;n | no ) return 1;;* ) echo "Answer yes or no"esacdone}2. Далее начинается основная часть программы.
echo "Original parameters are $*"if yes_or_no "$1"thenecho "Hi $1, nice name"elseecho "Never mind"fiexit 0Типичный вывод этого сценария может выглядеть следующим образом:
$ <b>./my_name Rick Neil</b>Original parameters are Rick NeilIs your name Rick ?Enter yes or no:<b> yes</b>Hi Rick, nice name$Как это работает
Когда сценарий начинает выполняться, функция определена, но еще не выполняется. В операторе
сценарий вызывает функциюif, передавая ей оставшуюся часть строки как параметры после заменыyes_or_noпервым параметром исходного сценария строкой$1. Функция использует эти параметры, в данный момент хранящиеся в позиционных параметрахRick,$1и т.д., и возвращает значение в вызывающую программу. В зависимости от возвращенного функцией значения конструкция$2выполняет один из операторов.ifКак видите, у командной оболочки есть большой набор управляющих структур и условных операторов. Вам необходимо познакомиться с некоторыми командами, встроенными в оболочку; после этого вы будете готовы решать реальные программистские задачи без компилятора под рукой!
Команды
В сценариях командной оболочки можно выполнять два сорта команд. Как уже упоминалось, существуют "обычные" команды, которые могут выполняться и из командной строки (называемые внешними командами), и встроенные команды (называемые внутренними командами). Внутренние команды реализованы внутри оболочки и не могут вызываться как внешние программы. Но большинство внутренних команд представлено и в виде автономных программ, это условие — часть требований стандарта POSIX. Обычно, не важно, команда внешняя или внутренняя, за исключением того, что внутренние команды действуют эффективнее.
В этом разделе представлены основные команды, как внутренние, так и внешние, которые мы используем при написании сценариев. Как пользователь ОС Linux, вы, возможно, знаете много других команд, которые принимает командная строка. Всегда помните о том, что вы можете любую из них применить в сценарии в дополнение к встроенным командам, представленным в данном разделе.
breakИспользуйте команду
для выхода из цикловbreak,forиwhileдо того, как будет удовлетворено управляющее условие. В командеuntilможно задать дополнительный числовой параметр, указывающий на число циклов, из которых предполагается выход. Однако это может сильно усложнить чтение сценариев, поэтому мы не советуем вам использовать его. По умолчаниюbreakобеспечивает выход из одного цикла.break#!/bin/shrm -rf fred*echo > fred1echo > fred2mkdir fred3echo > fred4for file in fred*doif [ -d "$file" ]; then