Ты всяко знаешь про специальные переменные со знаком $. Держу пари, знаешь только про базовые и часто используемые, типа $? и $1.
Сегодня рассмотрим еще парочку $@ и $*. Эти специальные переменные по сути выполняют одну и туже задачу: выводят список всех аргументов переданных скрипту. Но естественно есть различия в их использовании.
Голову не грей, теория всегда душная, сейчас на примерах рассмотрим и всё у тебя в голове сложится как надо.
Начнем с $@, накидываем скрипт:
Запускаем так:
На экран выводится:
Видим что каждый аргумент у нас вывелся отдельным словом. Даже несмотря на то, что последний аргумент у нас заключен в кавычки и является строкой с пробелами. В этом и особенность. Он наплевал на кавычки и разбил строку на дополнительные аргументы.
➕ Подпишись на BashDays в телеграм
А теперь немного переделаем скрипт (добавим кавычки) и запустим с теме же аргументами:
В этот раз на экран выведется такое:
Вот! Тут мы получили уже более ожидаемый результат. Массив: {$1, $2, $3}
Теперь про $*
После запуска с такими же аргументами:
Получаем то же самое, что и с $@ без кавычек. Шило на мыло. А вот если заключить $* в кавычки:
На экране мы получим:
Вот и отличие. Оно небольшое, оно практически ненужное. Но в этом и кроются детали. Все аргументы объединились в одну строку, отделенным символом пробела, заданным в IFS (пробел по умолчанию).
Если это не знать, то легко можно наступить на грабли.
Вот пример как заменить IFS разделитель (пробел на запятую):
Вывод будет таким:
Как «эффект бабочки», забыл поставить кавычки, сломал в будущем логику. Поставил кавычки, сломал другую логику. Куда не ткни, вечно какие-то костыли.
Я конечно сомневаюсь, что ты пользуешься таким высокоуровневым программированием (я не пользуюсь), но порой бывает натыкаешься на чужие скрипты с подобной логикой. И тогда важно не попасть в просак.
Ладно, не смею тебя больше отвлекать. Увидимся. Хорошего дня!