2013-05-18 5 views
2
bash-3.2$ echo astr | sed 'hah' | sed 's/s/z/' 
sed: 1: "hah": extra characters at the end of h command 
bash-3.2$ echo ${PIPESTATUS[*]} 
0 1 0 
bash-3.2$ echo astr | sed 'hah' | sed 's/s/z/' 
sed: 1: "hah": extra characters at the end of h command 
bash-3.2$ PIPERET=("${PIPESTATUS[*]}") 
bash-3.2$ echo ${PIPERET[*]} 
0 1 0 
bash-3.2$ 

Это означает, что [*] работает нормально. Но this tut упоминает вместо [@].Переменные массива Bash: [@] или [*]?

В равной степени ли они действительны?

+0

Смотрите здесь (http://tldp.org/LDP/abs/html/internalvariables.html) для ' PIPESTATUS [*] 'vs' PIPESTATUS [@] '. – devang

ответ

8

Разница имеет значение, главным образом, когда элементы массива содержат пробелы и т.д., и особенно несколько пробелов, и проявляется только тогда, когда выражения заключены в двойные кавычки:

$ x=(' a b c ' 'd e f') 
$ printf "[%s]\n" "${x[*]}" 
[ a b c d e f] 
$ printf "[%s]\n" "${x[@]}" 
[ a b c ] 
[d e f] 
$ printf "[%s]\n" ${x[@]} 
[a] 
[b] 
[c] 
[d] 
[e] 
[f] 
$ printf "[%s]\n" ${x[*]} 
[a] 
[b] 
[c] 
[d] 
[e] 
[f] 
$ 

Вне двойные кавычки, нет никакой разницы , Внутри двойных кавычек * означает «одна строка» и @ означает «элементы массива индивидуально».

Это близко аналогично тому, как $* и [email protected]"$*" и "[email protected]") работы.

bash Смотрите инструкцию по:

1

Цитирую man bash

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

Смежные вопросы