Яка різниця між @ і * при посиланні значень масиву bash?


15

Цей посібник Баша говорить:

Якщо номер індексу є @ або *, посилаються всі члени масиву.

Коли я це роблю:

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, я щойно помітив.
arjan

можливий дублікат Чому різниця між $ * і $ @?
goldilocks

@goldilocks Інше питання стосується $*і $@. Хоча відповідь була б схожа, і одне питання можна вважати підмножиною іншого, але це різні питання.
Stéphane Chazelas

Відповіді:


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 for, посилання списку * трактується як кілька змінних.
arjan

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