September 26

Специальные параметры $*, $@, $#, $?, $, $!, $0 в скриптах оболочки Linux

Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.

В скриптах оболочки Linux специальные параметры — это встроенные переменные, предоставляющие ценную информацию о среде выполнения скрипта, его аргументах и ​​состоянии. Эти параметры, часто обозначаемые символами *, @, #, ? и другими, необходимы для написания динамичных и надежных скриптов.

Что такое специальные параметры?

Специальные параметры в Linux — это предопределённые переменные в оболочке (например, Bash), содержащие определённую информацию, такую ​​как аргументы скрипта, идентификатор процесса или код завершения. В отличие от обычных переменных, эти параметры автоматически устанавливаются оболочкой и не могут быть назначены вручную. Доступ к ним обычно осуществляется с помощью префикса $ (например, $*, $@, $#), и они незаменимы для таких задач, как обработка аргументов, отладка и управление процессами.

Распространенные специальные параметры в Linux

Вот полный список специальных параметров в Linux.

1. $* — все позиционные параметры в виде одной строки

  • Описание: представляет все позиционные параметры (аргументы), переданные скрипту или функции, в виде одной строки, разделенной первым символом IFS (внутренний разделитель полей, обычно пробел).
  • Вариант использования: полезно, когда вы хотите рассматривать все аргументы как единое целое.
  • Пример:
#!/bin/bash 
echo "All arguments as a single string: $*"
  • Если запустить ./script.sh arg1 arg2 arg3, вывод будет следующим:
All arguments as a single string: arg1 arg2 arg3

2. $@ — Все позиционные параметры как отдельные строки

  • Описание: представляет все позиционные параметры, но каждый параметр рассматривается как отдельная строка. Полезно при переборе аргументов.
  • Вариант использования: предпочтительно, когда необходимо обрабатывать каждый аргумент по отдельности, особенно если аргументы содержат пробелы.
  • Пример:
#!/bin/bash 
for arg in "$@"; do
   echo "Argument: $arg" 
done
  • Запуск ./script.sh «arg1» arg2 arg3 выводит:
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
  • Выполнение ./script.sh arg1 выводит:
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

7. $0 — Название сценария

  • Описание: содержит имя скрипта или оболочки, выполняемого при вызове.
  • Вариант использования: полезно для автореферентных скриптов или отображения сообщений об использовании.
  • Пример:
#!/bin/bash
echo "Script name: $0"
  • Вывод ./script.sh:
Script name: ./script.sh

8. $1, $2, …, $n — индивидуальные позиционные параметры

  • Описание: представляет первый, второй и последующие аргументы, переданные скрипту или функции.
  • Вариант использования: используется для прямого доступа к определенным аргументам.
  • Пример:
#!/bin/bash
echo "First argument: $1"
echo "Second argument: $2"
  • Выполнение ./script.sh foo bar выводит:
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».

Практические советы по использованию специальных параметров

  1. Проверка аргументов: используйте $#, чтобы проверить, указано ли ожидаемое количество аргументов.
  2. Безопасная обработка пробелов: при переборе аргументов отдавайте предпочтение $@, а не $*, чтобы сохранить пробелы.
  3. Проверка статуса выхода: всегда проверяйте $? после критических команд для корректной обработки ошибок.
  4. Используйте временные файлы: объединяйте $ с именами временных файлов, чтобы избежать конфликтов (например, /tmp/script_$.log).
  5. Отладка: используйте $0 и $- для регистрации сведений о скрипте для отладки.

На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.