Unix / Linux - Специальные переменные

Здравствуйте, будущие программисты! Я рад приветствовать вас на этом захватывающем пути в мир специальных переменных Unix и Linux. Как某人, кто teaches computer science на протяжение многих лет, я могу заверить вас, что овладение этими концепциями изменит правила игры в вашем программировании. Итак, погружаемся в это!

Unix / Linux - Special Variables

Введение в специальные переменные

Прежде чем углубиться в детали, давайте поймем, что такое специальные переменные. В Unix и Linux специальные переменные - это предопределенные переменные, которые хранят конкретную информацию о среде shell и текущем процессе. Они resemble secret agents в мире shell, всегда готовые с важной информацией!

Командные аргументы

Что такое командные аргументы?

Командные аргументы - это дополнительные фрагменты информации, которые вы предоставляете скрипту при его выполнении. Это как давать инструкции роботу перед началом его задачи.

Давайте рассмотрим простой пример:

#!/bin/bash
echo "Hello, $1!"

Если мы сохраним этот скрипт как greet.sh и выполним его с помощью ./greet.sh Alice, он выведет:

Hello, Alice!

Здесь $1 - это специальная переменная, представляющая первый командный аргумент.

Использование нескольких аргументов

Мы не ограничены одним аргументом. Давайте расширяем наш скрипт:

#!/bin/bash
echo "Hello, $1! Welcome to $2."

Теперь, если мы выполним ./greet.sh Alice Wonderland, мы получим:

Hello, Alice! Welcome to Wonderland.

Здесь $1 represents "Alice", а $2 represents "Wonderland".

Переменная $0

Есть еще одна специальная переменная, worth mentioning: $0. Эта переменная represents имя скрипта само. Давайте изменим наш скрипт:

#!/bin/bash
echo "This script is called $0"
echo "Hello, $1! Welcome to $2."

Выполнение ./greet.sh Alice Wonderland теперь выводит:

This script is called ./greet.sh
Hello, Alice! Welcome to Wonderland.

Специальные параметры $* и $@

Теперь давайте поговорим о двух очень полезных специальных параметрах: $* и $@. Это как динамическая пара командных аргументов!

Параметр $*

Параметр $* represents все командные аргументы как одну строку. Это как положить все ваши аргументы в одну корзину. Вот пример:

#!/bin/bash
echo "All arguments using \$*: $*"

Если мы выполним этот скрипт с помощью ./args.sh apple banana cherry, мы получим:

All arguments using $*: apple banana cherry

Параметр $@

Параметр $@ аналогичен, но он treat каждый аргумент как отдельную сущность. Это как держать каждый аргумент в своем маленьком ящике. Давайте увидим это в действии:

#!/bin/bash
echo "All arguments using \$@:"
for arg in "$@"
do
echo $arg
done

Выполнение этого с помощью ./args.sh apple banana cherry дает:

All arguments using $@:
apple
banana
cherry

Разница между $* и $@

Вы можете задаться вопросом: "Они look такие же для меня!" Ну, разница становится очевидной, когда мы используем их в двойных кавычках. Давайте создадим скрипт для демонстрации:

#!/bin/bash
echo "Using \$*:"
for arg in "$*"
do
echo $arg
done

echo "Using \$@:"
for arg in "$@"
do
echo $arg
done

Если мы выполним это с помощью ./difference.sh "Hello World" OpenAI ChatGPT, мы получим:

Using $*:
Hello World OpenAI ChatGPT

Using $@:
Hello World
OpenAI
ChatGPT

См. разницу? "$*" treat все аргументы как одну строку, в то время как "$@" preserve отдельные аргументы.

Статус выхода

Последнее, но не менее важное, давайте поговорим о статусе выхода. В Unix и Linux каждая команда возвращает статус выхода после завершения выполнения. Этот статус - это число от 0 до 255, где 0 обычно означает успех, а любое другое число indicates ошибку.

Переменная $?

Статус выхода последней выполненной команды хранится в переменной $?. Давайте увидим это в действии:

#!/bin/bash
ls /nonexistent_directory
echo "Exit status of ls command: $?"

echo "Hello, World!"
echo "Exit status of echo command: $?"

Выполнение этого скрипта может вывести:

ls: cannot access '/nonexistent_directory': No such file or directory
Exit status of ls command: 2
Hello, World!
Exit status of echo command: 0

Команда ls failed (статус выхода 2), в то время как команда echo succeeded (статус выхода 0).

Использование статуса выхода в скриптах

Мы можем использовать статус выхода для принятия решений в наших скриптах. Вот пример:

#!/bin/bash
ping -c 1 google.com > /dev/null

if [ $? -eq 0 ]
then
echo "Internet is working!"
else
echo "Internet is not working!"
fi

Этот скрипт ping Google один раз и проверяет статус выхода. Если он равен 0 (успех), это означает, что интернет работает.

Заключение

Поздравляю! Вы только что сделали большой шаг в вашем пути программирования Unix/Linux. Эти специальные переменные могут показаться маленькими, но они incredibly powerful инструменты в вашем наборе инструментов для программирования. Помните, что практика делает мастера, так что не стесняйтесь экспериментировать с этими концепциями в своих собственных скриптах.

Вот quick reference таблица специальных переменных, которые мы рассмотрели:

Переменная Описание
$0 Имя скрипта
$1, $2, ... Командные аргументы
$* Все аргументы как одна строка
$@ Все аргументы как separate строки
$? Статус выхода последней команды

Продолжайте программировать, продолжайте учиться и, самое главное, получайте удовольствие! До следующего раза, счастливого скриптинга!

Credits: Image by storyset