@ и * в петле bash

Я обнаружил, что следующие две петли дают тот же результат. Можете ли вы помочь мне понять, какие различия между @ и * в этом конкретном случае?

 #!/bin/bash ips=(8.8.8.8 8.8.4.4) for ip in ${ips[@]}; do echo $ip done for ip in ${ips[*]}; do echo $ip done 

Оба они дают тот же результат:

 8.8.8.8 8.8.4.4 

Ссылка на страницу Bash Man

Любой элемент массива может ссылаться на $ {name [subscript]}. Скобки необходимы, чтобы избежать конфликтов с расширением пути. Если индексом является @ или *, слово расширяется для всех членов имени. Эти индексы отличаются только тогда, когда слово появляется в двойных кавычках .

Если слово double-quoted, $ {name [*]} расширяется до одного слова со значением каждого элемента массива, разделенного первым символом специальной переменной IFS, а $ {name [@]} расширяет каждый элемент имя к отдельному слову.

Когда нет элементов массива, $ {name [@]} расширяется до нуля. Если двойное кавычки происходит внутри слова, разложение первого параметра соединяется с начальной частью исходного слова, а расширение последнего параметра соединяется с последней частью исходного слова.

Что значит:

 munai@munai-devops:~$ declare -a array munai@munai-devops:~$ array=(1 2 3) munai@munai-devops:~$ bakIFS=$IFS munai@munai-devops:~$ IFS="," munai@munai-devops:~$ echo "${array[*]}" 1,2,3 munai@munai-devops:~$ echo "${array[@]}" 1 2 3 

Как вы заметили, между ними нет разницы – то есть, когда массивы не цитируются.

"${arr[*]}" расширяет массив до одного элемента, тогда как "${arr[@]}" расширяет каждый элемент, но сохраняет пробел (IFS).

Первый массив не изменится, а второй будет иметь выход:

 8.8.8.8 8.8.4.4