В чем разница между @ и * при обращении к значениям массива 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 ссылка на список * обрабатывается как несколько переменных.
Арджан

Что означает, что что-то должно рассматриваться как одна против нескольких переменных? Интересно, не могли бы вы привести практический пример, чтобы проиллюстрировать разницу?
Фрагмент
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.