В чем разница между @ и * при обращении к значениям массива bash?

15

Это руководство Bash говорит:

Если номер индекса равен @ или *, на все элементы массива ссылаются.

Когда я делаю это:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
  echo "example.$i "
done

Дает: example.1 example.2 example.3(желаемый результат).

Но когда я использую ${LIST[*]}, я получаю example.1 2 3вместо этого.

Почему?

Редактировать: при использовании printf @ и * фактически дают одинаковые результаты.

Арьян
источник
Кажется, это работает для меня. Я пробовал и @, и *, и, похоже, оба раза результат один и тот же. Какую оболочку вы используете? Запустите echo $SHELLи вставьте вывод в ваш вопрос.
Рамеш
Мой пример был неверным, это на самом деле происходит только с echo, а не с printf, я только что заметил.
Арджан
Возможный дубликат В чем разница между $ * и $ @?
Златовласка
@goldilocks Другой вопрос о $*и $@. Хотя ответ будет аналогичным, и один вопрос можно считать подмножеством другого, это разные вопросы.
Стефан Шазелас

Ответы:

17

Разница тонкая; «$ *» создает один аргумент, а «$ @» расширяется в отдельные аргументы, поэтому:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
 echo "example.$i"
done

будет иметь дело со списком (распечатать его) как несколько переменных

но

LIST=(1 2 3)
for i in "${LIST[*]}"; do
 echo "example.$i"
done

будет иметь дело со списком как одна переменная.

Нидал
источник
Вы знаете, где разница между echoи printfоткуда? Поскольку printfв цикле for ссылка на список * обрабатывается как несколько переменных.
Арджан
Что означает, что что-то должно рассматриваться как одна против нескольких переменных? Интересно, не могли бы вы привести практический пример, чтобы проиллюстрировать разницу?
Фрагмент