2015-03-11 4 views
1

Я получаю те же результаты как с echo "${array[@]}", так и с echo "${array[*]}".
Если да, то:
mkdir fakemusic; touch fakemusic/{Beatles,Stone,Ramones,Doors}{001..199}; cd fakemusic.
Тогда _msc=(*)
Эти две команды дают мне идентичные результаты:

echo "${_msc[@]}" 
echo "${_msc[*]}" 

Так что есть разница между ними.

+0

оба же, если вы не заключите их в двойные кавычки '«»'. – tod

ответ

3

Оболочка расширяет "${_msc[@]}" как отдельные строки, в то время как она расширяет "${_msc[*]}" как одну строку, причем элементы разделены пробелом по умолчанию. Вы не видите разницу с echo, потому что она также использует пространство в качестве разделителя. Ниже приведен пример с printf:

$ printf "%s;%s;%s\n" "${_msc[@]}" 
a;b;c 
$ printf "%s;%s;%s\n" "${_msc[*]}" 
a b c;; 

переменной оболочки IFS управления, какой символ используется в качестве разделителя. Если изменить его вы можете увидеть разницу с echo тоже:

$ IFS='|' 
$ echo "${_msc[*]}" # shell expands to a single string 
a|b|c 
$ echo "${_msc[@]}" # shell expands to a separate string 
a b c 
+0

Благодаря @Joni это то, что я думал, но не мог «видеть» разницу. Пример printf был идеальным. – menders65