Специальные параметры $*, $@, $#, $?, $, $!, $0 в скриптах оболочки Linux
Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.
В скриптах оболочки Linux специальные параметры — это встроенные переменные, предоставляющие ценную информацию о среде выполнения скрипта, его аргументах и состоянии. Эти параметры, часто обозначаемые символами *, @, #, ? и другими, необходимы для написания динамичных и надежных скриптов.
Что такое специальные параметры?
Специальные параметры в Linux — это предопределённые переменные в оболочке (например, Bash), содержащие определённую информацию, такую как аргументы скрипта, идентификатор процесса или код завершения. В отличие от обычных переменных, эти параметры автоматически устанавливаются оболочкой и не могут быть назначены вручную. Доступ к ним обычно осуществляется с помощью префикса $ (например, $*, $@, $#), и они незаменимы для таких задач, как обработка аргументов, отладка и управление процессами.
Распространенные специальные параметры в Linux
Вот полный список специальных параметров в Linux.
1. $* — все позиционные параметры в виде одной строки
- Описание: представляет все позиционные параметры (аргументы), переданные скрипту или функции, в виде одной строки, разделенной первым символом IFS (внутренний разделитель полей, обычно пробел).
- Вариант использования: полезно, когда вы хотите рассматривать все аргументы как единое целое.
- Пример:
#!/bin/bash echo "All arguments as a single string: $*"
All arguments as a single string: arg1 arg2 arg3
2. $@ — Все позиционные параметры как отдельные строки
- Описание: представляет все позиционные параметры, но каждый параметр рассматривается как отдельная строка. Полезно при переборе аргументов.
- Вариант использования: предпочтительно, когда необходимо обрабатывать каждый аргумент по отдельности, особенно если аргументы содержат пробелы.
- Пример:
#!/bin/bash for arg in "$@"; do echo "Argument: $arg" done
Argument: arg1 Argument: arg2 Argument: arg3
3. $# — Количество позиционных параметров
- Описание: содержит количество позиционных параметров, переданных скрипту или функции.
- Пример использования: полезно для проверки количества аргументов перед их обработкой.
- Пример:
#!/bin/bash echo "Number of arguments: $#" if [ $# -lt 2 ]; then echo "Error: At least 2 arguments required" exit 1 fi
Number of arguments: 1 Error: At least 2 arguments required
4. $? — Статус завершения последней команды
- Описание: сохраняет код завершения последней выполненной команды. Значение 0 указывает на успешное выполнение, а ненулевые значения — на неудачу.
- Вариант использования: используется для проверки ошибок и управления потоком скриптов.
- Пример:
#!/bin/bash ls /nonexistent echo "Exit status of ls: $?"
ls: cannot access '/nonexistent': No such file or directory Exit status of ls: 2
5. $ — идентификатор процесса текущего скрипта
- Описание: содержит идентификатор процесса (PID) оболочки или скрипта, запущенного в данный момент.
- Вариант использования: полезно для ведения журнала, создания временных файлов или отслеживания выполнения скриптов.
- Пример:
#!/bin/bash echo "My process ID: $"
My process ID: 12345
6. $! — Идентификатор процесса последней фоновой команды
- Описание: сохраняет PID последней команды, выполненной в фоновом режиме.
- Вариант использования: полезно для управления или мониторинга фоновых процессов.
- Пример:
#!/bin/bash sleep 10 & echo "Background process ID: $!"
Background process ID: 67890
- Описание: содержит имя скрипта или оболочки, выполняемого при вызове.
- Вариант использования: полезно для автореферентных скриптов или отображения сообщений об использовании.
- Пример:
#!/bin/bash echo "Script name: $0"
Script name: ./script.sh
8. $1, $2, …, $n — индивидуальные позиционные параметры
- Описание: представляет первый, второй и последующие аргументы, переданные скрипту или функции.
- Вариант использования: используется для прямого доступа к определенным аргументам.
- Пример:
#!/bin/bash echo "First argument: $1" echo "Second argument: $2"
First argument: foo Second argument: bar
9. $- — Текущие параметры оболочки
- Описание: содержит текущие параметры оболочки (например, hB для хэш-функции и расширения фигурных скобок).
- Вариант использования: полезно для отладки или проверки конфигурации оболочки.
- Пример:
#!/bin/bash echo "Current shell options: $-"
Current shell options: hB
10. $_ — Последний аргумент предыдущей команды
- Описание: содержит последний аргумент последней выполненной команды.
- Пример использования: удобно для повторного использования последнего аргумента в интерактивных оболочках.
- Пример:
#!/bin/bash echo "hello world" echo "Last argument: $_"
hello world Last argument: world
Ключевые различия: $* против $@
Одна из распространённых путаниц — разница между $* и $@. Вот краткое сравнение:
- $*: объединяет все аргументы в одну строку, что может вызвать проблемы с аргументами, содержащими пробелы.
- $@: сохраняет каждый аргумент как отдельную строку, что делает итерацию более безопасной.
#!/bin/bash for arg in $*; do echo "From \$*: $arg" done for arg in "$@"; do echo "From \$@: $arg" done
Запуск ./script.sh «arg 1» arg2 выводит:
From $*: arg From $*: 1 From $*: arg2 From $@: arg 1 From $@: arg2
Обратите внимание, как $@ правильно обрабатывает пробелы в «arg 1».
Практические советы по использованию специальных параметров
- Проверка аргументов: используйте $#, чтобы проверить, указано ли ожидаемое количество аргументов.
- Безопасная обработка пробелов: при переборе аргументов отдавайте предпочтение $@, а не $*, чтобы сохранить пробелы.
- Проверка статуса выхода: всегда проверяйте $? после критических команд для корректной обработки ошибок.
- Используйте временные файлы: объединяйте $ с именами временных файлов, чтобы избежать конфликтов (например, /tmp/script_$.log).
- Отладка: используйте $0 и $- для регистрации сведений о скрипте для отладки.
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.