Оба варианта выглядят почти одинаково, но ведут себя принципиально по-разному, особенно если в аргументах есть пробелы.
Предположим, скрипт запущен так:
./script.sh "file one.txt" "file two.txt"
▪️ "$@" - правильный вариант
for arg in "$@"; do
echo "[$arg]"
done
Вывод:
[file one.txt]
[file two.txt]
Каждый аргумент сохраняется как отдельная сущность.
Это то, чего вы ожидаете в 99% скриптов.
▪️ "$*" - частая ловушка
for arg in "$*"; do
echo "[$arg]"
done
Вывод:
[file one.txt file two.txt]
Все аргументы склеены в одну строку через IFS (по умолчанию пробел).
▪️ Почему это ломает скрипты
Передача аргументов дальше:
rm "$*"
rm получает один путь, которого не существует.Обработка файлов:
cp "$*" /backup
копирование падает или ведет себя странно.
Работа с пробелами:
один аргумент = несколько файлов (по мнению bash).
BashTex 📱 #bash #utils