@ e * no laço bash [duplicado]

1

Eu encontrei os dois loops seguintes com a mesma saída. Você pode me ajudar a entender quais são as diferenças entre o @ e o * neste caso específico?

#!/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

Ambos produzem o mesmo resultado:

8.8.8.8
8.8.4.4
    
por Elgs Qian Chen 18.09.2015 / 12:24

2 respostas

4

Citação de página do Bash Man

Any element of an array may be referenced using ${name[subscript]}. The braces are required to avoid conflicts with pathname expansion. If subscript is @ or * , the word expands to all members of name. These subscripts differ only when the word appears within double quotes.

IF the word is double-quoted, ${name[*]} expands to a single word with the value of each array member separated by the first character of the IFS special variable, and ${name[@]} expands each element of name to a separate word.

When there are no array members, ${name[@]} expands to nothing. If the double-quoted expansion occurs within a word, the expansion of the first parameter is joined with the beginning part of the original word, and the expansion of the last parameter is joined with the last part of the original word.

O que significa:

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
    
por 18.09.2015 / 12:57
1

Como você percebeu, não há diferença entre os dois - é quando os arrays não são citados.

"${arr[*]}" expande a matriz para um elemento, enquanto "${arr[@]}" expande cada elemento, mas preservando o espaço em branco (IFS).

O primeiro array não mudará, mas o segundo terá a saída de:

8.8.8.8 8.8.4.4
    
por 18.09.2015 / 12:44

Tags