2013-05-18 3 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 대신 [@]을 사용합니다.배시 배열 변수 : [@] 또는 [*]?

모두 똑같이 유효합니까? 첨자 @ 또는 * 경우

+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

말을 인용, 단어는 이름의 모든 멤버로 확장됩니다. 이 아래 첨자는 단어가 큰 따옴표 안에 나타날 때만 다릅니다. 단어가 큰 따옴표로 묶여 있으면 $ {name [*]}은 IFS 특수 문자의 첫 번째 문자로 구분 된 각 배열 구성원의 값을 갖는 단일 단어로 확장되고 $ {name [@]}가 확장됩니다 이름의 각 요소는 단어로 구분됩니다. 배열 구성원이 없을 때 $ {name [@]}는 으로 확장되지 않습니다. 이중 따옴표 확장이 단어 내에서 발생하면 첫 번째 매개 변수의 확장이 원래 단어 의 시작 부분과 결합되고 마지막 매개 변수의 확장은 원래 단어의 마지막 부분과 함께 에 연결됩니다.